前言
java反射机制指的是在java运行过程中,对于任意的类都可以知道他的所有属性以及方法,对于任意一个对象都可以任意的调用他的属性和方法,这种动态获取对象信息和动态调用对象方法的功能称为java反射机制,但是反射使用不当会造成很高的成本。
简单实例
反射获取类名称
|
|
输出结果:
|
|
以上的 c1,c2,c3是完全一样的,他们都有一个统一的名称:叫做Reflect类的类类型。
反射的用处
获取成员方法
|
|
通过反射获取成员方法调用的实例:
输出结果:
所以我们只要知道类的全限定名就可以任意的调用里面的方法。
|
|
输出结果:
使用的还是之前那个Person类,所以这里只写了关键代码。这里输出的是Person的所有public方法。
如果我们调用getMethods()
方法会是什么结果呢?
输出结果:
这时我们会发现这里输出的结果会比刚才多得多,这时因为getMethods()
方法返回的是包括父类的所有方法。
获取成员变量
我们还可以通过反射来获取类包括父类的成员变量,主要方法如下:
还是按照之前例子中的Person类举例,他具有两个成员变量:
我们可以通过以下方法来获取其中的成员变量:
通过以下例子可以获取指定对象上此field的值:
输出结果:
我们也可以通过方法getDeclaredFieds()
方法来获取所有的成员变量,返回是是一个Field[]
数组,只需要遍历这个数组即可获所有的成员变量。例子如下:
|
|
输出结果如下:
获取构造方法
可以通过以下两个方法来获取构造方法:
在之前的Person类中有以下的构造方法:
我们可以通过以下方法来获取Person类的构造方法:
具体代码如下:
dc1.newInstance("小明","很帅");
方法调用了Person类中的:
这个构造方法,如果不传参数的话,那么调用的就是无参的构造方法。输出结果为:
通过反射了解集合泛型的本质
通过以下例子程序可以看出:
所以可以看出,泛型只是在编译期间起作用,在经过编译进入运行期间是不起作用的。就算是不是泛型要求的类型也是可以插入的。
反射知识点
总结
泛型的应用比较多:
- spring的IOC/DI。
- JDBC中的中的加载驱动