反射方法 的简单使用
获得字节码文件对象的三种方式
首先第一句,一切皆对象。类、属性、方法、构造器都是对象
该篇文章其实就注重两个点、是否有declared前缀,带有private的记得调用setAccessible
所涉及到的类:Class、Field、Construcotr、Method
-
Object类的getClass方法
-
类型.class 属性
-
Class.forName(“类的路径”)
都为true,内存地址是一样的。在程序的运行中,Person的class文件只被加载了一次。
注意:除了反射案例。在此赠送一套最新Java架构项目实战教程+大厂面试题库,想学的 点击此处免费获取,小白勿进哦
也为true,可知只加载了一次
也为true
用字节码文件对象来构建一个类的对象
字节码文件对象中包含:
那么 这4个 在 字节码文件对象中叫什么呢?
java文件 | 字节码文件 |
---|---|
类 | 字节码文件对象 |
构造方法 | 构造方法对象(类型Constructor) |
成员变量 | 成员变量对象(类型Field) |
成员方法 | 成员方法(类型Method) |
之前一直用new的形式来创建一个类的对象
Person p = new Person()
加粗部分是类的构造方法,因为对象是通过构造方法创建的
用字节码文件中的构造器对象来创建一个类的对象——Constructor对象
获得Constructor来创建对象
注意:getDeclaredConstructor(Class<?>… parameterTypes)
这个方法会返回指定参数类型的所有构造器,**包括public的和非public的,**当然也包括private的。
getDeclaredConstructors()的返回结果就没有参数类型的过滤了。
再来看getConstructor(Class<?>… parameterTypes)
这个方法返回的是上面那个方法返回结果的子集,只返回制定参数类型访问权限是public的构造器。
getConstructors()的返回结果同样也没有参数类型的过滤。
用反射有什么好处呢?之前Spring ioc有讲。可以通过配置文件动态创建对象:
来:
创建一个a.txt用来存储要创建对象的 全路径名称,之后读取这个字符串,用class.forName创建就可以了。以Person为例
获取名称后也可创建对象。
构造方法对象
四个访问修饰符:
getConstrustors是获取公有的,所以只有一个
getDeclaredConstructors这个就是得到所有的
获取指定的构造器
这是public的,如果不是public,使用getConstructor获得指定方法机会报NoSuchMethodException
所以也是用带Declared的getDeclaredConstructor
那么其他访问修饰符呢?
私有的可以得到构造器,但是不能创建对象
通过constructor.setAccessible(true)设置为可以访问
方法对象
它也有这些
其他方法是因为还有Object的,当然这是public的,要所有的需要加上Declared
先给Person加上getter与setter,以及该类的一个私有方法
可以发现有以下的区别
1.不带declared是得到所有的public修饰的method 包括从父类继承过来的Declared
2.带declared是得到当前类中的所有Method
注意,getMethod()是得到公有的方法,同样的也有getDeclaredMethod()
同样的,如果将getName()这个方法的访问权限改为私有的,那么也将报 **IllegalAccessException **
那么也是一样的,需要设置一下
得到属性对象
getField跟getDeclaredField,跟上面的一样的。因为这里是private