最详细易懂的反射教程
阅读此篇之前最好花几分钟看看https://blog.****.net/javacoder_juejue/article/details/81160186了解了解类加载的知识
看了上面,何为反射?反射简而言之就是通过Class文件对象去使用该文件中的成员变量,成员方法,构造方法
而成员变量,成员方法,构造方法在API中分别对应
Field,Constructor,Method类(JAVASE部分必须要学会熟练运用API)
既然了解了反射,那么我么现在基于API的帮助来使用反射吧(*^_^*)
一.首先我们先创建一个Person类,后面要用
二.反射要首先得到Class文件
获得一个类得Class文件对象的方式有三种,如下
1.Person p = new Person();
Class c = p.getClass();
2.Class c1 = Person.Class;
3.Class c2 = Class.forName("cn.robert.entity.Person"); // " "内 类名前面记得要加包名
既然有三种,那么我们用哪个呢?
三.通过反射获取构造方法并使用
在API里查找Class的返回值为construcor的方法,可以找到如下这些
为了学英语我用的是英文版。。就瞧瞧就行了,看下面详细解释及演示
上面是获取并遍历Person类所有构造方法,打印结果如下
、
1.演示通过无参构造创建对象:
我们都知道构造方法用于创建对象前对对象的初始化,那么得到Constructor对象后我们要如何创建对象呢?
这时我们在API种查找Constructor的方法,找到了创建对象的方法,newInstance,如下高亮区域。
控制台输出结果如下(由于我们没有传参数,各成员变量值都为0或null)
2.演示带参构造方法创建对象:
控制台输出结果如下
总结,通过若是带参构造创建对象,那么获取构造器对象时,getConstructor()方法里就带参数类型,如下
然后创建实例时newInstance()方法里传入参数即可,
若是无参构造创建对象则以上两个方法都不需要带参
3.演示通过私有构造方法创建对象
先再上面加一个参数为String类型的私有构造方法,然后再运行下面代码
不出意外,报错
那么,我们如何调用私有构造方法呢?查看API在Construtor中找到如下方法
在上述代码中获取构造器后加入如下代码后,发现成功通过私有构造创建对象
四.通过反射获取成员变量并初始化
方法前面加Declared代表获取所有,没加的代表只获取public修饰的
控制台输出结果如下:
控制台输出结果如下:
获取单个成员变量
通过阅读API发现对获取到的成员变量赋值方式如下
示例如下:
注意:当获取的成员变量为private修饰时,需要
,跟上面构造方法一样,否则会报没有权限访问的错误
四.通过反射获取成员方法并使用
上面都看懂了的话,看这里这里也就很简单了
好的,老套路,继续查看API
调用方法的方式如下
示例如下:
打印结果如下:
五.通过反射运行配置文件上的内容(很多框架的底层都是反射实现的)
先创建配置文件:className必须为带包路径的类,method必须为存在的方法名
六.通过反射越过泛型检查
如下,正常的创建对象调用方法,如果ArrayList泛型为Integer那么add方法里传字符串会无法通过编译
这时反射登场
为什么呢?java的泛型检查是在编译的时候发生的,运行过程中,泛型是不会检查的。
七.练习题(活用反射)
测试效果如下