反射
Summary::
反射是什么
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种运行时获取的信息以及调用对象的方法的功能称为java语言的反射机制。
反射的作用
- 获取任意类的名称、package信息、所有属性、方法、注解、类型、类加载器等
- 获取任意对象的属性,并且能改变对象的属性
- 调用任意对象的方法
- 判断任意一个对象所属的类
- 实例化任意一个类的对象
- 通过反射我们可以实现动态装配,降低代码的耦合度,动态代理等。
反射的使用
获取注解
下面代码尝试获取RetentionTest
类的runtimeRetentionTest
方法上的RuntimeRetentionAnnotation
注解,该注解有一个value叫times()用来标识执行该方法多少次。
// 获取方法上的注解的值
Method method = new RetentionTest().getClass().getDeclaredMethod("runtimeRetentionTest");
RetentionAnnotation.RuntimeRetentionAnnotation annotation;
if (method.isAnnotationPresent(RetentionAnnotation.RuntimeRetentionAnnotation.class)) {
annotation = method.getAnnotation(RetentionAnnotation.RuntimeRetentionAnnotation.class);
for(int i=0; i<annotation.times(); i++) {
method.invoke(test);
}
}
构造对象
通过 Class 对象的 newInstance() 方法。
Class clz = Class.forName("com.Test");
Test jg= (Test)clz.newInstance();
通过 Constructor 对象的 newInstance() 方法
Class clz = Class.forName("com.Test");
Constructor constructor = clz.getConstructor();
Test jg= (Test)constructor.newInstance();
反射的原理
要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.
反射的应用场景
Spring 框架的 IOC(动态加载管理 Bean)
Spring AOP(动态代理)功能
除此之外还有很多框架:mybatis、dubbo、rocketmq等等都会用到反射机制。