对于reflect Java的反射机制,相信很多没有经验的人都无能为力。因此,本文总结了问题产生的原因及解决方法。希望你能通过这篇文章解决这个问题。
一、类型识别的两种方式:
首先,“运行时类型识别”(rtti)主要有两种方式。
* * *物种:我们已经知道编译时和运行时的所有类型。
其次,我们在整个项目中编译模块,并在运行时动态编译新添加的模块。(在动态编译模块之前,编译代码的类型是未知的。)这就是要被接受的强大“反射”机制。
二、认识“Class对象”:
要理解Java中RTTI (Runtime Type Recognition)的工作原理,我们必须首先知道类型信息在运行时是如何表达的。这项工作由“类对象”完成,它包含与类相关的信息。
类是程序的重要组成部分(类的属性、方法以及它的一些特性,我在这里就不重复了。),每个类都有一个Class对象。每当编写和编译一个新类时,都会生成一个类对象,该类对象将保存在一个. class文件中,该文件与您创建的新类同名。然后当程序运行时,当我们想要生成这个类的对象(实例化这个类)时,运行这个程序的Java虚拟机(JVM)会这样做:
首先,它将加载。创新类的类文件,
然后确认这个新类的类对象是否已经加载。如果没有,JVM会找到。类文件并加载它。一旦这个类的类对象被加载到内存中,它将被用来创建这个类的所有对象。
一般RTTI表格包括三种类型:
1.传统类型转换。例如,“(苹果)水果”,RTTI保证类型转换的正确性。如果执行了不正确的类型转换,将引发ClassCastException异常。
2.通过类对象获取对象的类型。诸如
[code=' Java ']Class c=Class . for name(" Apple ");
对象o=c . NewInstance();
3.通过关键字instanceof或Class.isInstance()确定对象是否属于特定类型的实例。确切地说,instanceof/Class.isInstance()可用于确定对象是否属于特定类及其所有基类的实例,这不同于equals()/==。它们用于比较两个对象是否属于同一个类的实例,而不考虑继承。
三、反射
如果你不知道一个对象的类型,你可以通过RTTI得到它,但前提是编译时必须知道类型,这样你就可以用RTTI来识别它。也就是说,在编译时,编译器必须知道RTTI处理的所有类。
反射机制可以不受此限制使用,主要应用于两种情况:
* * *案例是“基于组件的编程”,其中将使用一些基于快速应用程序开发(RAD)的应用程序构建工具来构建项目。这是目前最常见的可视化编程方法,通过将代表不同组件的图标拖动到画板上,然后设置“组件”(components)的属性值来配置它们以创建程序。为了实现这种配置编程,有必要要求所有组件都是可实例化的,并公开其部分信息,以便程序员可以读取和设置组件的值和状态。在处理GUI时间工件时,还必须公开相关方法的事件处理细节,这样RAD环境可以帮助程序员覆盖这些处理事件的方法。这里,反射机制用于检查可用的方法并返回方法实体对象。基于组件的编程架构是通过JavaBeans提供的。
在第二种情况下,在运行时获取类信息的另一个动机是提供跨网络在远程平台上创建和运行对象的能力。这被称为远程调用(RMI),它允许一个Java程序在多台机器上步进对象。这种循序渐进的能力将帮助开发人员执行需要大量计算的任务,充分利用计算机资源,提高运行速度。
类支持反射,反射包括java.lang.reflect中的Field/Method/Constructor类,每个类都实现了Member接口。这些类型的对象由JVM在运行时创建,以表示未知类中的相应成员。例如,您可以使用构造函数类创建一个新对象,使用get()和set()方法读取和修改与字段对象关联的字段,并使用invoke()方法调用与方法对象关联的方法。同时,还可以调用getFields()、getMethods()、getConstructors()等方法,返回表示字段、方法和构造函数的对象数组。这样就可以在运行时完全确定未知对象的类信息,在编译时不需要知道任何信息。
此外,RTTI有时还能解决效率问题。当程序中使用多态性时,会给程序的运行带来负担。可以用RTTI写一段代码来提高效率。
看完以上,你掌握了reflect Java的反射机制了吗?如果您想学习更多技能或了解更多相关内容,请关注行业资讯频道。感谢阅读!
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/44643.html