首页 > 编程知识 正文

java反射机制的应用,java的反射机制是怎么实现的

时间:2023-05-05 04:30:33 阅读:41056 作者:738

视频说明来源: https://www.bilibili.com/video/b v1rx 41197 TC? from=search seid=1660395204966504496

反射到底是什么意思?提出的目的是什么?

反射机制: Java反射机制在运行状态下可以知道任何类的所有属性和方法; 对于任何对象,都可以调用其方法和属性之一。 这种动态检索的信息以及动态调用对象的方法的功能称为Java语言的反射机制。 就像去医院拍CT和剩下的放射科,拍摄结束后你会看到你所有人的具体框架。 那么,我们说的这个反射是根据什么来映射类的呢? 在类的字节码文件(即class文件)中,可以从class文件中获得类的成员属性、类的构造方法和类的成员方法,这相当于知道类的内部结构)

当jvm将class文件加载到虚拟机内存中时,它将转换为java.lang.Class对象实例。 也就是说,每个字节码文件加载后都是class对象,可以检索类中的构造方法、成员变量和成员方法

因此,为了实现反射,首先需要取得字节码对象(相当于CT切片)

获取类的字节码对象的方法1 (每个类从object继承的getClass )方法() ) ) ) ) ) ) ) ) )。

获取类的字节码对象的方法2 (通过每个类的class属性) )。

获取字节码对象的方法3 (最常见的方法,Class类的静态方法forName ) )。

虽然上面介绍了获取字节码对象的三种方法,但是可以看到,通过每种方法获取的同一类的字节码对象是相同的。 创建字节码对象后,也就是说,在拍摄CT切片后,您需要知道如何在字节码对象中反射目标类。 因此,您需要知道这个字节码对象包含什么,也就是说,从字节码文件中可以得到什么是目标类。

使用字节码对象获取构建方法对象(Constructor )并创建类对象

首先定义实体类人员。

Package reflex; 公共类人员{//专用属性private String name='Tom '; //公共属性public int age=18; //构建方法1 public Person () }//构建方法2publicperson(stringname,int age ) )//私有方法private void say ) ) system.out.println (//}要批量检索所有公共构造函数,请关注为父类定义的getConstructors ()未提供类定义的私有构造函数,然后检索为类定义的非公共构造函数

批量获取所有构造方法getDeclaredConstructors () getConstructors () )只能获取类中的公共构造方法,是友好和受保护的私有构造方法

获取某个构造函数。 此处使用的是getConstructor (参数列表,与上述带“s”的构造函数不同。 请注意,内部参数列表是根据类中定义的构造函数的参数确定的。 但是,这里传递的参数是相应类型的字节码对象

1 getConstructor (参数列表)此方法可以检索类中声明的所有公共构造函数之一。 具体来说,哪个是根据参数列表决定的?

2 getDeclaredConstructor (参数列表)此方法可以检索类中声明的所有构造函数之一。 具体来说,请注意根据参数列表决定哪个。 可以快速创建字节码对象,而无需首先获取构造函数,然后创建类对象。 (也就是说,类中必须有无参数的构造函数方法。 ) )。

object new instance=class.new instance ()相当于以下两个语句

构造器构造器=class.get构造器(;

object new instance=constructor.getinstance (;

从双字节代码对象获取成员方法对象(Method )方法对象和获取构造函数的方法相同,有四种方法) getmethodsgetdeclaredmethod (getconsossgetdeclaredmethod )

创建上面的构造函数后,可以使用getInstance创建对象。 这个方法对象是创建的,如何运行的呢? 使用的是invoke (类对象,参数)注意事项: getMethods,getMethod可以获取类中定义的公共方法和父类中定义的公共方法

getDeclaredMethods,getDeclaredMethod可以检索类中定义的所有方法,但不能检索父类中的方法

从3字节码对象获取成员字段对象(Field )获取成员字段对象的方法和获取成员的方法是相同的,即getfieldsgetdeclaredfieldsgetfieldgetdeclaredgetdeclaredgetfieldgetdeclareclarered

得到成员变量对象后如何使用,使用set (对象、参数)

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。