《企业级应用系统体系架构一简介.ppt》由会员分享,可在线阅读,更多相关《企业级应用系统体系架构一简介.ppt(95页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、企业级应用系统体系架构一简介 Still waters run deep.流静水深流静水深,人静心深人静心深 Where there is life,there is hope。有生命必有希望。有生命必有希望课程开设目的课程开设目的 n开设本课的目的就是要让软件学院的本科生能够构建开设本课的目的就是要让软件学院的本科生能够构建企业级分布式应用系统企业级分布式应用系统n不但知道该如何做,并且还要知道为什么那样做,以不但知道该如何做,并且还要知道为什么那样做,以及如何才能做好及如何才能做好n与与信息系统建模信息系统建模课程形成有机的集成,了解企业课程形成有机的集成,了解企业应用系统从建模到设计实现
2、的完整过程和方案应用系统从建模到设计实现的完整过程和方案前导内容前导内容n什么是企业应用系统什么是企业应用系统n中间件技术中间件技术n软件构件技术及其后继技术软件构件技术及其后继技术nJava EE与与.NET简介简介nXML及其应用及其应用n注解注解n访问数据库访问数据库-JDBC&ADO.NETnJavaBean构件构件n事务管理事务管理n消息管理消息管理nRMI与与EJBnEJB3.0中的会话中的会话BeannEJB3.0中的实体中的实体BeannEJB3.0中的消息驱动中的消息驱动Bean3授课主题与内容授课主题与内容 n本课授课本课授课17次,每次次,每次2学时,共学时,共34学时:
3、学时:n基于构件的分析与设计技术基于构件的分析与设计技术n安全控制、事务管理、消息机制、表示层开发技术安全控制、事务管理、消息机制、表示层开发技术nWeb Services技术技术nJava EE中的中的Web Servicesn.NET中的中的Web Servicesn基于基于RESTful的的WSnWeb2.0技术技术nAjax和和FlexnSOA技术技术nSOA 基础理论、面向服务的分析与设计、基础理论、面向服务的分析与设计、SOA实现方式举例实现方式举例n企业级应用系统体系架构的主要质量属性,以及实现对这些质量企业级应用系统体系架构的主要质量属性,以及实现对这些质量属性的要求可以采用的
4、设计策略。属性的要求可以采用的设计策略。考核方式考核方式n课程大作业课程大作业n该课程大作业将与该课程大作业将与信息系统建模信息系统建模课程的大作业统一课程的大作业统一n大作业以小组为单位完成大作业以小组为单位完成n大作业考核将与大作业考核将与信息系统建模信息系统建模课程一并进行,从不同角度考课程一并进行,从不同角度考核给分核给分n部分大作业将与摩根史坦利合作部分大作业将与摩根史坦利合作n成绩构成成绩构成n课程大作业中期检查课程大作业中期检查20%,第,第11周周末(周周末(5月月7-8日)日)n课程大作业期末验收课程大作业期末验收50%n期末考试期末考试30%,闭卷笔试,闭卷笔试助教与答疑助
5、教与答疑n助教助教n王文婷王文婷 n答疑答疑n陈昊鹏:周三陈昊鹏:周三14:00-16:00 软件大楼软件大楼1111n王文婷:周三王文婷:周三14:00-16:00 软件大楼软件大楼5402n摩根工程师:项目组协商摩根工程师:项目组协商企业级应用系统体系架构(一)企业级应用系统体系架构(一)架构特征架构特征2022/11/11What is Enterprise ApplicationnEnterprise applications often have complex data-and lots of it-to work on,together with business rules t
6、hat fail all tests of logical reasoning.nOther terms for enterprise applications include“information systemsnEnterprise applications include payroll,patient records,shipping tracking,cost analysis,credit scoring,insurance,supply chain,accounting,customer service,and foreign exchange trading.nEnterpr
7、ise applications dont include automobile fuel injection,word processors,elevator controllers,chemical plant controllers,telephone switches,operating systems,compilers,and games.What is Enterprise ApplicationnEnterprise applicationsnusually involve persistent data nusually have a lot of data nusually
8、 many people access data concurrently nusually have a lot of user interface screens nusually they need to integrate with other enterprise applications scattered around the enterprise nconceptual dissonance with the data ncomplex business illogic 10企业应用系统的特征企业应用系统的特征n一个企业系统是具备下列性质的系统:一个企业系统是具备下列性质的系统
9、:n共享某些或全部在应用中被使用的资源共享某些或全部在应用中被使用的资源n规划成为内部使用规划成为内部使用n必须在现有的架构内运行必须在现有的架构内运行n将由内部将由内部ITIT员工部署并提供支持员工部署并提供支持n需要更强的健壮性,对于异常处理和可扩展性都是如此需要更强的健壮性,对于异常处理和可扩展性都是如此n只能适度地失败只能适度地失败n必须合理地处理系统随时间推移而发生的演化必须合理地处理系统随时间推移而发生的演化Dimensions of software complexityHigher technical complexity-Embedded,real-time,distribu
10、ted,fault-tolerant-Custom,unprecedented,architecture reengineering-High performanceLower technical complexity-Mostly 4GL,or component-based-Application reengineering-Interactive performanceHighermanagement complexity -Large scale -Contractual -Many stake holders -“Projects”Lowermanagement complexity
11、 -Small scale -Informal -Single stakeholder -“Products”Defense MIS SystemDefense Weapon SystemTelecom SwitchCASE ToolNational Air TrafficControl SystemEnterprise IS(Family of ISApplications)CommercialCompilerBusinessSpreadsheetIS ApplicationDistributed Objects(Order Entry)Small ScientificSimulationL
12、arge-ScaleOrganization/EntitySimulation An average software project-5-10 people-3-9 month duration-3-5 external interfaces-Some unknowns&risksEmbeddedAutomotive SoftwareIS ApplicationGUI/RDB(Order Entry)Typical System ArchitectureWhat is Software ArchitectureEnterprise/Product ArchitectureEnterprise
13、/Product ArchitectureBusiness ArchitectureBusiness ArchitectureApplication ArchitectureApplication ArchitectureTechnical ArchitectureTechnical ArchitectureProduct ArchitectureProduct ArchitectureSoftware Architecture Quality Metricsn Availabilityn Reliability n Modifiabilityn Performancen Securityn
14、Testabilityn Usabilityn SupportabilityOther factors to considernBusiness objectives(T2M,Targeted Market)nSkill of development team and local market of teamnCost to build and Maintain v.s.BenefitnMateriality of TechnologynCurrent System constrain,integrationnMigration,migration,migrationSummarynSoftw
15、are Architecture need to consider from both technical point of view as well as business point of viewnThere are different ways to communicate architecture design nThere is no THE best architecture for any one software systemnAlways need considernexternal constrain,such cost,infrastructure,nMaturity
16、of IT organization,not only development,but also operationsnArchitecture is a live entity,therefore,ability to grow,migrate is very important16企业级应用系统体系架构(一)企业级应用系统体系架构(一)安全安全12022/11/11From:1.Prentice.Hall.PTR:Core Java 2 Volume II Advanced Features,8th.Edition.Apri.2008.17内容提要内容提要n类加载器类加载器n字节码校验字节
17、码校验n安全管理器与访问权限安全管理器与访问权限n数字签名数字签名n代码签名代码签名n加密加密18类加载器类加载器nJava编译器能够将源程序转化为假想机器的机器语言,这种机器编译器能够将源程序转化为假想机器的机器语言,这种机器称为虚拟机。称为虚拟机。解释器能够将虚拟机的指令集翻译成目标机器的机解释器能够将虚拟机的指令集翻译成目标机器的机器语言。器语言。n请注意,虚拟机只加载程序执行时所需要的类文件。例如,假设请注意,虚拟机只加载程序执行时所需要的类文件。例如,假设程序从程序从MyProgram.class开始运行,下面是虚拟机执行的步骤:开始运行,下面是虚拟机执行的步骤:n虚拟机有一个用于加
18、载类文件的机制,例如,从磁盘上读取虚拟机有一个用于加载类文件的机制,例如,从磁盘上读取文件或者请求文件或者请求web上的文件;它使用该机制来加载上的文件;它使用该机制来加载MyProgram类文件中的内容。类文件中的内容。n如果如果MyProgram类拥有类型为另一个类的实例变量,或者是类拥有类型为另一个类的实例变量,或者是拥有超类,那么这些类文件也会被加载。(加载某个类所依拥有超类,那么这些类文件也会被加载。(加载某个类所依赖的所有类的过程称为赖的所有类的过程称为类的解析类的解析。)。)n接着,虚拟机执行接着,虚拟机执行MyProgram中的中的main方法(它是静态的,方法(它是静态的,无
19、需创建类的实例)。无需创建类的实例)。n如果如果main方法或者方法或者main调用的方法要用到更多的类,那么接调用的方法要用到更多的类,那么接下来就会加载这些类。下来就会加载这些类。19类加载器类加载器n然而,类加载机制并非只使用单个的类加载器。每个然而,类加载机制并非只使用单个的类加载器。每个Java程序至程序至少拥有三个类加载器:少拥有三个类加载器:n引导类加载器引导类加载器n扩展类加载器扩展类加载器n系统类加载器(有时也称为应用类加载器)系统类加载器(有时也称为应用类加载器)20类加载器类加载器n引导类加载器负责加载系统类(通常从引导类加载器负责加载系统类(通常从JAR文件文件rt.j
20、ar中进行加载)中进行加载)。它是虚拟机整体中的一部分,而且通常是用。它是虚拟机整体中的一部分,而且通常是用C语言来实现的。语言来实现的。引导类加载器没有对应的引导类加载器没有对应的ClassLoader对象对象,例如,该方法,例如,该方法String.class.getClassLoader()将返回将返回null。n扩展类加载器用于从扩展类加载器用于从jre/lib/ext目录加载目录加载“标准的扩展标准的扩展”。你可以。你可以将将JAR文件放入该目录,这样即使没有任何类路径,扩展类加载文件放入该目录,这样即使没有任何类路径,扩展类加载器也可以找到其中的各个类。器也可以找到其中的各个类。n
21、系统类加载器用于加载应用类系统类加载器用于加载应用类。它在由。它在由CLASSPATH环境变量或环境变量或者者-classpath命令行选项设置的类路径中的目录里或者是命令行选项设置的类路径中的目录里或者是JAR/ZIP文件里查找这些类。文件里查找这些类。n在在Sun公司的公司的Java语言实现中,扩展类加载器和系统类加载器都语言实现中,扩展类加载器和系统类加载器都是用是用Java来实现的。它们都是来实现的。它们都是URLClassLoader类的实例。类的实例。21类加载器类加载器n类加载器有一种类加载器有一种“父子父子”关系。关系。除了引导类加载器外,每个类加除了引导类加载器外,每个类加载
22、器都有一个父类加载器载器都有一个父类加载器。根据规定,类加载器会为它的父类加根据规定,类加载器会为它的父类加载器提供一个机会,以便加载任何给定的类,并且只有在其父类载器提供一个机会,以便加载任何给定的类,并且只有在其父类加载器加载失败时,它才会加载该给定类加载器加载失败时,它才会加载该给定类。例如,当要求系统类。例如,当要求系统类加载器加载一个系统类(比如,加载器加载一个系统类(比如,java.util.ArrayList)时,它首先)时,它首先要求扩展类加载器进行加载,该扩展类加载器则首先要求引导类要求扩展类加载器进行加载,该扩展类加载器则首先要求引导类加载器进行加载。引导类加载器查找并加载
23、加载器进行加载。引导类加载器查找并加载rt.jar中的这个类,而中的这个类,而无须其他类加载器做更多的搜索。无须其他类加载器做更多的搜索。22将类加载器作为命名空间将类加载器作为命名空间n每个每个Java程序员都知道,包的命名是为了消除名字冲突。在标准程序员都知道,包的命名是为了消除名字冲突。在标准类库中,有两个名为类库中,有两个名为Date的类,它们的实际名字分别为的类,它们的实际名字分别为java.util.Date和和java.sql.Date。使用简单的名字只是为了程序员的。使用简单的名字只是为了程序员的方便,它们要求程序要包含恰当的方便,它们要求程序要包含恰当的import语句。在一
24、个正在执行语句。在一个正在执行的程序中,所有的类名都包含它们的包名。的程序中,所有的类名都包含它们的包名。n然而,令人惊奇的是,然而,令人惊奇的是,在同一个虚拟机中,可以有两个类,它们在同一个虚拟机中,可以有两个类,它们的类名和包名都是相同的。类是由它的全名的类名和包名都是相同的。类是由它的全名和和类加载器来确定的。类加载器来确定的。这项技术在加载来自多处的代码时很有用。例如,浏览器为每一这项技术在加载来自多处的代码时很有用。例如,浏览器为每一个个web页都使用了一个独立的页都使用了一个独立的applet类加载器类的实例。这样,虚类加载器类的实例。这样,虚拟机就能区分来自不同拟机就能区分来自不
25、同web页的各个类,而不用管它们的名字是页的各个类,而不用管它们的名字是什么。什么。23编写你自己的类加载器编写你自己的类加载器n如果要编写自己的类加载器,你只需要继承如果要编写自己的类加载器,你只需要继承ClassLoader类,然后类,然后覆盖下面这个方法覆盖下面这个方法findClass(StringclassName)nClassLoader超类的超类的loadClass方法用于将类的加载操作委托给其父方法用于将类的加载操作委托给其父类加载器去进行,只有当该类尚未加载并且父类加载器也无法加类加载器去进行,只有当该类尚未加载并且父类加载器也无法加载该类时,才调用载该类时,才调用findC
26、lass方法。方法。n如果要实现该方法,你就必须:如果要实现该方法,你就必须:n为来自本地文件系统或者其他来源的类加载其字节码。为来自本地文件系统或者其他来源的类加载其字节码。n调用调用ClassLoader超类的超类的defineClass方法,向虚拟机提供字节方法,向虚拟机提供字节码。码。24编写你自己的类加载器编写你自己的类加载器n我们建立了一个类加载器,我们建立了一个类加载器,用于加载加密过的类文件。用于加载加密过的类文件。该程序要求用户输入第一个该程序要求用户输入第一个要加载的类的名字(即包含要加载的类的名字(即包含main方法的类)和密钥。然方法的类)和密钥。然后,使用一个专门的类
27、加载后,使用一个专门的类加载器来加载指定的类并调用器来加载指定的类并调用main方法。该类加载器对指方法。该类加载器对指定的类和所有被其引用的非定的类和所有被其引用的非系统类进行解密。最后,该系统类进行解密。最后,该程序调用已加载类的程序调用已加载类的main方方法。法。25编写你自己的类加载器编写你自己的类加载器 classCryptoClassLoaderextendsClassLoader/*Constructsacryptoclassloader.paramkthedecryptionkey*/publicCryptoClassLoader(intk)key=k;protectedCl
28、assfindClass(Stringname)throwsClassNotFoundExceptionbyteclassBytes=null;tryclassBytes=loadClassBytes(name);26编写你自己的类加载器编写你自己的类加载器catch(IOExceptione)thrownewClassNotFoundException(name);Classcl=defineClass(name,classBytes,0,classBytes.length);if(cl=null)thrownewClassNotFoundException(name);returncl;/
29、*Loadsanddecrypttheclassfilebytes.paramnametheclassnamereturnanarraywiththeclassfilebytes*/privatebyteloadClassBytes(Stringname)throwsIOException27编写你自己的类加载器编写你自己的类加载器Stringcname=name.replace(.,/)+.caesar;FileInputStreamin=null;in=newFileInputStream(cname);tryByteArrayOutputStreambuffer=newByteArray
30、OutputStream();intch;while(ch=in.read()!=-1)byteb=(byte)(ch-key);buffer.write(b);in.close();returnbuffer.toByteArray();finallyin.close();28编写你自己的类加载器编写你自己的类加载器privateintkey;n我们的我们的Caesar密码版本使用的密钥是从密码版本使用的密钥是从1255之间的一个数字,之间的一个数字,解密时,只需将密钥与每个字节相加,然后对解密时,只需将密钥与每个字节相加,然后对256取余。取余。Caesar.java程序就实现了这种加密行为
31、。程序就实现了这种加密行为。n为了不与通常的类加载器相混淆,我们对加密的类文件使用了不为了不与通常的类加载器相混淆,我们对加密的类文件使用了不同的扩展名同的扩展名.caesar。n解密时,类加载器只需要将每个字节减去该密钥即可。解密时,类加载器只需要将每个字节减去该密钥即可。29编写你自己的类加载器编写你自己的类加载器importjava.io.*;/*EncryptsafileusingtheCaesarcipher.*/publicclassCaesarpublicstaticvoidmain(Stringargs)if(args.length!=3)System.out.println(
32、USAGE:javaCaesarinoutkey);return;tryFileInputStreamin=newFileInputStream(args0);FileOutputStreamout=newFileOutputStream(args1);intkey=Integer.parseInt(args2);30编写你自己的类加载器编写你自己的类加载器intch;while(ch=in.read()!=-1)bytec=(byte)(ch+key);out.write(c);in.close();out.close();catch(IOExceptionexception)excepti
33、on.printStackTrace();31编写你自己的类加载器编写你自己的类加载器publicvoidrunClass(Stringname,Stringkey)tryClassLoaderloader=newCryptoClassLoader(Integer.parseInt(key);Classc=loader.loadClass(name);Stringargs=newString;Methodm=c.getMethod(main,args.getClass();m.invoke(null,(Object)args);catch(Throwablee)JOptionPane.show
34、MessageDialog(this,e);32编写你自己的类加载器编写你自己的类加载器n对类文件进行加密有很大的用途(当然,使用的密码的强度应该对类文件进行加密有很大的用途(当然,使用的密码的强度应该高于高于Caesar密码),如果没有加密密钥,类文件就毫无用处。它密码),如果没有加密密钥,类文件就毫无用处。它们既不能由标准虚拟机来执行,也不能轻易地被反汇编。们既不能由标准虚拟机来执行,也不能轻易地被反汇编。n这就是说,这就是说,你可以使用定制的类加载器来认证类用户的身份,或你可以使用定制的类加载器来认证类用户的身份,或者确保程序在运行之前已经支付了软件费用者确保程序在运行之前已经支付了软件
35、费用。当然,加密只是定。当然,加密只是定制类加载器的应用之一。你可以使用其他类型的加载器来解决别制类加载器的应用之一。你可以使用其他类型的加载器来解决别的问题,例如,将类文件存储到数据库中。的问题,例如,将类文件存储到数据库中。33编写你自己的类加载器编写你自己的类加载器njava.lang.Class1.0nClassLoadergetClassLoader()n获取加载该类的类加载器。获取加载该类的类加载器。njava.lang.ClassLoader1.0nClassLoadergetParent()1.2n返回父类加载器,如果父类加载器是引导类加载器,则返回返回父类加载器,如果父类加载
36、器是引导类加载器,则返回null。nstaticClassLoadergetSystemClassLoader()1.2n获取系统类加载器,即用于加载第一个应用类的类加载器。获取系统类加载器,即用于加载第一个应用类的类加载器。nprotectedClassfindClass(Stringname)1.2n类加载器应该覆盖该方法,以查找类的字节码,并通过调用类加载器应该覆盖该方法,以查找类的字节码,并通过调用defineClass方法将字节码传给虚拟机。方法将字节码传给虚拟机。n参数参数:nname类名类名;使用使用.作为包名分隔符,并且不使用作为包名分隔符,并且不使用.class后缀后缀34编
37、写你自己的类加载器编写你自己的类加载器nClassdefineClass(Stringname,bytedata,intoffset,intlength)n将一个新的类添加到虚拟机中。将一个新的类添加到虚拟机中。n参数参数:nname类名类名;使用使用.作为包名分隔符,并且不使用作为包名分隔符,并且不使用.class后缀后缀ndata用于存放该类字节码的数组用于存放该类字节码的数组noffset数组中字节码的起始位置数组中字节码的起始位置nlength数组中字节码的长度数组中字节码的长度njava.lang.Thread1.0nClassLoadergetContextClassLoader(
38、)1.2n获取类加载器,该线程的创建者将其指定为执行该线程时最适合使获取类加载器,该线程的创建者将其指定为执行该线程时最适合使用的类加载器。用的类加载器。nvoidsetContextClassLoader(ClassLoaderloader)1.2n为该线程中的代码设置一个类加载器,以获取要加载的类。如果在为该线程中的代码设置一个类加载器,以获取要加载的类。如果在启动一个线程时没有显式地设置上下文类加载器,则使用父线程的启动一个线程时没有显式地设置上下文类加载器,则使用父线程的上下文类加载器。上下文类加载器。35内容提要内容提要n类加载器类加载器n字节码校验字节码校验n安全管理器与访问权限安
39、全管理器与访问权限n数字签名数字签名n代码签名代码签名n加密加密36字节码校验字节码校验n当类加载器将新加载的当类加载器将新加载的Java平台类的字节码传递给虚拟机时,这平台类的字节码传递给虚拟机时,这些字节码首先要接受些字节码首先要接受“校验器(校验器(verifier)”的校验。的校验。校验器负责检校验器负责检查那些指令无法执行的明显有破坏性的操作。除了系统类外,所查那些指令无法执行的明显有破坏性的操作。除了系统类外,所有的类都要被校验,有的类都要被校验,不过,你可以使用非正式的不过,你可以使用非正式的-noverify选项来选项来钝化校验。钝化校验。n例如,你可以使用下面的命令行:例如,
40、你可以使用下面的命令行:java-noverifyHello37字节码校验字节码校验n下面是校验器执行的一些检查:下面是校验器执行的一些检查:n变量要在使用之前进行初始化。变量要在使用之前进行初始化。n方法调用与对象引用类型之间要匹配。方法调用与对象引用类型之间要匹配。n访问私有数据和方法的规则没有被违反。访问私有数据和方法的规则没有被违反。n对本地变量的访问都在运行时堆栈内。对本地变量的访问都在运行时堆栈内。n运行时堆栈没有溢出。运行时堆栈没有溢出。n如果以上这些检查中任何一条没有通过,那么该类就被认为遭到如果以上这些检查中任何一条没有通过,那么该类就被认为遭到了破坏,并且不予加载。了破坏,
41、并且不予加载。38字节码校验字节码校验n这种严格的校验是出于安全上的考虑这种严格的校验是出于安全上的考虑n通过修改运行时堆栈中的值,或者向系统对象的私有数据字通过修改运行时堆栈中的值,或者向系统对象的私有数据字段写入数据,某个程序就会突破浏览器的安全防线。段写入数据,某个程序就会突破浏览器的安全防线。n用用Java语言编译器生成的类文件总是可以通过校验的语言编译器生成的类文件总是可以通过校验的。n校验器总是在防范被故意篡改的类文件,而不仅仅只是检查校验器总是在防范被故意篡改的类文件,而不仅仅只是检查编译器产生的类文件。编译器产生的类文件。39字节码校验字节码校验n下面的例子将展示如何创建一个变
42、动过的类文件。我们从示例程下面的例子将展示如何创建一个变动过的类文件。我们从示例程序序VerifierTest.java开始。这是一个简单的程序,它调用一个方法,开始。这是一个简单的程序,它调用一个方法,并且显示方法的运行结果。该程序既可以在控制台运行,也可以并且显示方法的运行结果。该程序既可以在控制台运行,也可以作为一个作为一个Applet程序来运行。其中的程序来运行。其中的fun方法本身只是负责计算方法本身只是负责计算1+2。staticintfun()intm;intn;m=1;n=2;intr=m+n;returnr;40字节码校验字节码校验n作为一次实验,请尝试编译下面这个对该程序进
43、行修改后的文件。作为一次实验,请尝试编译下面这个对该程序进行修改后的文件。staticintfun()intm=1;intn;m=1;m=2;intr=m+n;returnr;41字节码校验字节码校验n在这种情况下,在这种情况下,n没有被初始化,它可以是任何随机值。当然,编没有被初始化,它可以是任何随机值。当然,编译器能够检测到这个问题并拒绝编译该程序。如果要建立一个不译器能够检测到这个问题并拒绝编译该程序。如果要建立一个不良的类文件,我们必须得多花点功夫。首先,运行良的类文件,我们必须得多花点功夫。首先,运行javap程序,以程序,以便知晓编译器是如何翻译便知晓编译器是如何翻译fun方法的。
44、下面这个命令方法的。下面这个命令javap-cVerifierTestn用助记(用助记(mnemonic)格式显示了类文件中的字节码。)格式显示了类文件中的字节码。42字节码校验字节码校验Methodintfun()0iconst_11istore_02iconst_23istore_14iload_05iload_16iadd7istore_28iload_29ireturn43字节码校验字节码校验n我们使用一个十六进制编辑器将指令我们使用一个十六进制编辑器将指令3从从istore_1改为改为istore_0,也,也就是说,局部变量就是说,局部变量0(即(即m)被初始化了两次,而局部变量)被
45、初始化了两次,而局部变量1(即(即n)则根本没有初始化。)则根本没有初始化。0iconst_1041istore_03B2iconst_2053istore_13C4iload_01A5iload_11B6iadd607istore_23D8iload_21C9ireturnAC44字节码校验字节码校验n你可以使用十六进制编辑器你可以使用十六进制编辑器(例如(例如DataWorkshop,可以,可以从从http:/www.dataworkshop.de处下载)来进行修改操作。处下载)来进行修改操作。当然,你也可以使用当然,你也可以使用hexl-mode的的emacs进行修改。在左进行修改。在左
46、图中,你可以看到类文件图中,你可以看到类文件VerifierTest.class被加载到了被加载到了DataWorkshop编辑器中,编辑器中,fun方法的字节码已经被选定。方法的字节码已经被选定。45字节码校验字节码校验n将将3C改为改为3B并保存类文件。然后设法运行并保存类文件。然后设法运行VerifierTest程序。你将程序。你将会看到下面的出错信息:会看到下面的出错信息:Exceptioninthreadmainjava.lang.VerifyError:(class:VerifierTest,method:funsignature:()I)Accessingvaluefromuni
47、nitializedregister1n这很好,虚拟机发现了我们所做的修改。这很好,虚拟机发现了我们所做的修改。46字节码校验字节码校验n现在用现在用-noverify选项(或者选项(或者-Xverify:none)来运行程序:)来运行程序:java-noverifyVerifierTestn从表面上看,从表面上看,fun方法似乎返回了一个随机值。但实际上,该值是方法似乎返回了一个随机值。但实际上,该值是2与存储在尚未初始化的变量与存储在尚未初始化的变量n中的值相加得到的结果。下面是典中的值相加得到的结果。下面是典型的输出结果:型的输出结果:1+2=1510233047内容提要内容提要n类加载
48、器类加载器n字节码校验字节码校验n安全管理器与访问权限安全管理器与访问权限n数字签名数字签名n代码签名代码签名n加密加密48安全管理器与访问权限安全管理器与访问权限n安全管理器是一个负责控制某个操作是否允许执行的类安全管理器是一个负责控制某个操作是否允许执行的类。安全管。安全管理器负责检查的操作包括以下几个:理器负责检查的操作包括以下几个:n当前线程是否能够创建一个新的类加载器;当前线程是否能够创建一个新的类加载器;n当前线程是否能够中止虚拟机的运行;当前线程是否能够中止虚拟机的运行;n某个类是否能够访问另一个类的成员;某个类是否能够访问另一个类的成员;n当前线程是否能够访问本地文件;当前线程
49、是否能够访问本地文件;n当前线程是否能够打开到达外部主机的当前线程是否能够打开到达外部主机的socket连接;连接;n某个类是否能够启动打印作业;某个类是否能够启动打印作业;n某个类是否能够访问系统剪贴板;某个类是否能够访问系统剪贴板;n某个类是否能够访问某个类是否能够访问AWT事件队列;事件队列;n当前线程是否可被信任以打开一个顶层窗口。当前线程是否可被信任以打开一个顶层窗口。n整个整个Java类库中还有许多其他类似的检查。类库中还有许多其他类似的检查。49安全管理器与访问权限安全管理器与访问权限n在运行在运行Java应用程序时,应用程序时,缺省的设置是不安装安全管理器的缺省的设置是不安装安
50、全管理器的,这,这样所有的操作都是允许的。另一方面,样所有的操作都是允许的。另一方面,applet浏览器都直接地安浏览器都直接地安装了一个功能受限的安全管理器装了一个功能受限的安全管理器。n例如,例如,applet不允许退出虚拟机。如果它们试图调用不允许退出虚拟机。如果它们试图调用exit方法,就方法,就会抛出一个安全异常。下面将详细说明这种情况。会抛出一个安全异常。下面将详细说明这种情况。Runtime类的类的exit方法调用安全管理器的方法调用安全管理器的checkExit方法,下面是方法,下面是exit方法的全部方法的全部代码:代码:publicvoidexit(intstatus)Se