反射

Summary::

反射是什么

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种运行时获取的信息以及调用对象的方法的功能称为java语言的反射机制。

反射的作用

反射的使用

获取注解

下面代码尝试获取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等等都会用到反射机制。

反射的性能