标签:poi 代码 name 代码块 行操作 语义 实例化 全路径 参数类型
Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。
java类的执行需要经历以下过程,
编译:.java文件编译后生成.class字节码文件
加载:类加载器负责根据一个类的全限定名来读取此类的二进制字节流到JVM内部,并存储在运行时内存区的方法区,然后将其转换为一个与目标类型对应的java.lang.Class对象实例
链接
验证:格式(class文件规范) 语义(final类是否有子类) 操作
准备:静态变量赋初值和内存空间,final修饰的内存空间直接赋原值,此处不是用户指定的初值。
解析:符号引用转化为直接引用,分配地址
初始化:有父类先初始化父类,然后初始化自己;将static修饰代码执行一遍,如果是静态变量,则用用户指定值覆盖原有初值;如果是代码块,则执行一遍操作。
获取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具有的部分方法如下:
Field具有的部分方法:
1. 如果字段不是静态字段的话,要传入反射类的对象.如果传null是会报java.lang.NullPointerException
2. 如果字段是静态字段的话,传入任何对象都是可以的,包括null
参数:第一个参数是方法属于的对象(如果是静态方法,则可以直接传 null)第二个可变参数是该方法的参数
返回值:Object
引用链接:https://blog.csdn.net/h2604396739/article/details/83109292
标签:poi 代码 name 代码块 行操作 语义 实例化 全路径 参数类型
原文地址:https://www.cnblogs.com/lcx20190724xxz/p/11237090.html