反射机制
Posted lcx20190724xxz
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了反射机制相关的知识,希望对你有一定的参考价值。
一、什么是反射
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
以上是关于反射机制的主要内容,如果未能解决你的问题,请参考以下文章