Java运行原理与反射机制.pdfVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
运行时类型识别(Run-time Type Identification, RTTI)主要有两种方式,一种是我们在编译时和 运行时已经知道了所有的类型,另外一种是功能强大的“反射”机制。 要理解RTTI 在Java 中的工作原理,首先必须知道类型信息在运行时是如何表示的,这项工 作是由“Class 对象”完成的,它包含了与类有关的信息。类是程序的重要组成部分,每个类 都有一个Class 对象,每当编写并编译了一个新类就会产生一个Class 对象,它被保存在一 个同名的.class 文件中。在运行时,当我们想生成这个类的对象时,运行这个程序的Java 虚 拟机(JVM)会确认这个类的Class 对象是否已经加载,如果尚未加载,JVM 就会根据类名查 找.class 文件,并将其载入,一旦这个类的 Class 对象被载入内存,它就被用来创建这个类 的所有对象。一般的RTTI 形式包括三种: 1.传统的类型转换。如“(Apple)Fruit”,由RTTI 确保类型转换的正确性,如果执行了一个错 误的类型转换,就会抛出一个ClassCastException 异常。 2.通过Class 对象来获取对象的类型。如 Class c = Class.forName(“Apple”); Object o = c.newInstance(); 3.通过关键字instanceof 或Class.isInstance()方法来确定对象是否属于某个特定类型的实例, 准确的说,应该是instanceof / Class.isInstance()可以用来确定对象是否属于某个特定类及其 所有基类的实例,这和equals() / ==不一样,它们用来比较两个对象是否属于同一个类的实 例,没有考虑继承关系。 反射 如果不知道某个对象的类型,可以通过RTTI 来获取,但前提是这个类型在编译时必须已知, 这样才能使用RTTI 来识别。即在编译时,编译器必须知道所有通过RTTI 来处理的类。 使用反射机制可以不受这个限制,它主要应用于两种情况,第一个是“基于构件的编程”,在 这种编程方式中,将使用某种基于快速应用开发(RAD) 的应用构建工具来构建项目。这是现 在最常见的可视化编程方法,通过代表不同组件的图标拖动到图板上来创建程序,然后设置 构件的属性值来配置它们。这种配置要求构件都是可实例化的,并且要暴露其部分信息,使 得程序员可以读取和设置构件的值。当处理GUI 时间的构件时还必须暴露相关方法的细细, 以便RAD 环境帮助程序员覆盖这些处理事件的方法。在这里,就要用到反射的机制来检查 可用的方法并返回方法名。Java 通过JavaBeans 提供了基于构件的编程架构。 第二种情况,在运行时获取类的信息的另外一个动机,就是希望能够提供在跨网络的远程平 台上创建和运行对象的能力。这被成为远程调用(RMI),它允许一个Java 程序将对象分步在 多台机器上,这种分步能力将帮助开发人员执行一些需要进行大量计算的任务,充分利用计 算机资源,提高运行速度。 Class 支持反射,java.lang.reflect 中包含了 Field/Method/Constructor 类,每个类都实现了 Member 接口。这些类型的对象都是由 JVM 在运行时创建的,用来表示未知类里对应的成 员。如可以用Constructor 类创建新的对象,用get()和set()方法读取和修改与Field 对象关联 的字段,用 invoke()方法调用与 Method 对象关联的方法。同时,还可以调用 getFields() 、 getMethods() 、getConstructors()等方法来返回表示字段、方法以及构造器的对象数组。这样, 未知的对象的类信息在运行时就能被完全确定下来,而在编译时不需要知道任何信息。 另外,RTTI 有时能解决效率问题。当程序中使用多态给程序的运行带来负担的时候,可以 使用RTTI 编写一段代码来提高效率。 Java 的反射机制的实现要借助于4 个类:class,Constructor,Field,Method ;其中class 代 表的时类对 象,Constructor-类的构造器对象,Field -类的属性对象,Method -类的方法 对象。通过这四个对象我们可以粗略的看到一个类的各个组 成部分。 Class :程序运行时,java 运行时系统会对所有的对象进行运行时类型的处理。这项信息记 录了每个对象所属的类,虚拟机通常使用运行时类型信息选择正 确的方法来执行(摘自: 白皮书)。但是这些信息我们怎么得到啊,就要借助于class

文档评论(0)

feiyang66 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档