- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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
您可能关注的文档
最近下载
- 建筑施工高处作业安全技术规范JGJ80-202420240805.pptx VIP
- 【精编版】部编教材四年语文上册全册课后作业(含答案解析) .pdf VIP
- BHE-336F风电-光伏箱变智能监控装置说明书.pdf VIP
- 通力电梯LCE无机房KDM KDL中文注释版电气原理图.pdf
- 第二单元+探索+3+物联网的定位技术+课件+2024—2025学年苏科版(2023)+初中信息技术八年级上册.pptx VIP
- 人教版美术七上 第一单元第1课《情感的表达》课件.pptx
- 2025年招聘考试宝典物流经理竞聘笔试模拟题与答案详解.docx VIP
- 小学语文六年级上册期末试卷 (21).doc VIP
- 关于勤奋学习的名人故事(通用63则).docx VIP
- 2025年压裂装备市场分析报告.docx
文档评论(0)