前言
在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为反射机制。
我们知道,Java语言不是动态语言,但是他却有非常突出的动态相关机制,反射机制。
代码
我们可以通过反射机制获取一个class的相关信息。
1. 利用Javassist获取class信息
Javassist是一个动态类库,可以用来检查、”动态”修改以及创建 Java类。其功能与jdk自带的反射功能类似,但比反射功能更强大。
1 | public static void getClassInfoByJavassist(Class clazz) { |
我们新建一个Demo.class
1 | public class Demo { |
调用方法 getClassInfoByJavassist(Demo.class),输出class信息。
1 | class-->com.zwt.reflect.Demo |
2. 通过spring里的LocalVariableTableParameterNameDiscoverer获取paramsName,使用jdk自带reflect反射类获取class其他信息
在jdk1.8以下java版本中,根据jdk自带reflect包,可以拿到大部分class信息,唯一拿不到的是参数name,我们可以借助spring包里的LocalVariableTableParameterNameDiscoverer去获取paramsName。
1 | public static void getClassInfoBySpringAndReflect(Class clazz) { |
调用getClassInfoBySpringAndReflect(Demo.class),也可以拿到class信息。
3.使用jdk1.8及以上java版本获取class信息
若jdk版本较高,完全可以不用借助第三方jar包而获取class信息。
jdk1.8以上,添加了Parameter类,可以获取参数paramsName.
1 | public static void getClassInfoByJava8AndReflect(Class clazz){ |
调用getClassInfoByJava8AndReflect(Demo.class),获取class信息。
其他
反射优点:
合理的使用反射机制可以有效降低代码冗余及代码量。并且可以让应用程序实现一些几乎不可能做到的事情。反射属于Java语言里比较高级的一个特性。
反射缺点:
如果不合理的使用反射,可能降低系统性能。
而且非常重要的一点,我们看如上代码,有一句fields[i].setAccessible(true);
这是在设置私有属性可以访问,显然,这破坏了代码的抽象性,而且可能导致安全问题的产生。