反射机制

一、什么是反射

Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。

二、反射的原理

java类的执行需要经历以下过程,

  • 编译:.java文件编译后生成.class字节码文件

  • 加载:类加载器负责根据一个类的全限定名来读取此类的二进制字节流到JVM内部,并存储在运行时内存区的方法区,然后将其转换为一个与目标类型对应的java.lang.Class对象实例

  • 链接

  • 验证:格式(class文件规范) 语义(final类是否有子类) 操作

  • 准备:静态变量赋初值和内存空间,final修饰的内存空间直接赋原值,此处不是用户指定的初值。

  • 解析:符号引用转化为直接引用,分配地址

  • 初始化:有父类先初始化父类,然后初始化自己;将static修饰代码执行一遍,如果是静态变量,则用用户指定值覆盖原有初值;如果是代码块,则执行一遍操作。 

Java的反射就是利用上面第二步加载到jvm中的.class文件来进行操作的。.class文件中包含java类的所有信息,当你不知道某个类具体信息时,可以使用反射获取class,然后进行各种操作。

三、代码

获取Class对象的三种方法:

//1、已实例化的对象可调用 getClass() 方法来获取,通常应用在:传过来一个 Object类型的对象,不知道具体是什么类,用这种方法
Person p1 = new Person();
Class c1 = p1.getClass();
//2、类名.class 的方式得到,该方法最为安全可靠,程序性能更高,这说明任何一个类都有一个隐含的静态成员变量 class
Class c2 = Person.class;
//3、通过类的全路径名获取Class对象,用的最多,如果根据类路径找不到这个类那么就会抛出 ClassNotFoundException异常。
Class c3 = Class.forName("com.reflex.Person");

那么这3中方式我们一般选用哪种方式呢?第一种已经创建了对象,那么这个时候就不需要去进行反射了,显得有点多此一举。第二种需要导入类的包,依赖性太强。所以一般选第三种方式。

需要注意的是:一个类在 JVM 中只会有一个 Class 实例,即对上面获取的 c1,c2,c3进行 equals 比较,发现都是true。

Class具有的部分方法如下:

  • getName():获得类的完整名字。
  • getFields():获得类的public类型的属性。
  • getDeclaredFields():获得类的所有属性。包括private 声明的和继承类
  • getMethods(String name, Class<?>... parameterTypes):获得类的public类型的方法。
  • getDeclaredMethods():获得类的所有方法。包括private 声明的和继承类
  • getMethod(String name, Class[] parameterTypes):获得类的特定方法,name参数指定方法的名字,parameterTypes 参数指定方法的参数类型。
  • getConstructors():获得类的public类型的构造方法。
  • getConstructor(Class[] parameterTypes):获得类的特定构造方法,parameterTypes 参数指定构造方法的参数类型。
  • newInstance():通过类的不带参数的构造方法创建这个类的一个对象。

Field具有的部分方法:

  • Field.getType():获取属性声明时类型对象
  • getGenericType():返回属性声的Type类型
  • set(Object obj, Object value):将指定对象变量上此 Field 对象表示的字段设置为指定的新值.
  • Field.get(Object obj):取得对象的Field属性值

1. 如果字段不是静态字段的话,要传入反射类的对象.如果传null是会报java.lang.NullPointerException 

2. 如果字段是静态字段的话,传入任何对象都是可以的,包括null

  • invoke(Object receiver, Object... args)

    参数:第一个参数是方法属于的对象(如果是静态方法,则可以直接传 null)第二个可变参数是该方法的参数

    返回值:Object

 

引用链接:https://blog.csdn.net/h2604396739/article/details/83109292 

 

原文地址:https://www.cnblogs.com/lcx20190724xxz/p/11237090.html