最详细易懂的反射教程

阅读此篇之前最好花几分钟看看https://blog.csdn.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的泛型检查是在编译的时候发生的,运行过程中,泛型是不会检查的。

七.练习题(活用反射)

测试效果如下

猜你喜欢

转载自blog.csdn.net/javacoder_juejue/article/details/81181232
今日推荐