- JVM的反射机制是在Java类编译成字节码的时候,通过jdk提供的工具类的反射方式访问类字节码的字段、方法。并且可以进行一些在Java代码中不能够实现的功能。
- 反射使用的经典场景:Spring的ioc的依赖注入,以及一些IDE的代码开发联想功能;
- 之前通过JVM的反射机制还编写了Hibernate的变种版(针对旅游系统的全文检索,对全量索引的数据源功能)。
- 以上对于JVM的反射功能是通过Java原生代码是实现不了的,但对于反射也是不能频繁使用的,反射机制的效率是很低的,尤其是在统一进程反复调用的时候,反射机制的效率会更加低,以下要通过事列来说明反射机制效率低下的原因。
反射调用的实现
反射的工具代码都在jdk的java.lang.reflect包下
调用代码:
public final class Method extends Executable {
@CallerSensitive
public Object invoke(Object var1, Object... var2) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
//省略......
MethodAccessor var4 = this.methodAccessor;
if (var4 == null) {
var4 = this.acquireMethodAccessor();
}
return var4.invoke(var1, var2);
}
- 可以看到method.invoke()方法是委派给了MethodAccessor来处理.MethodAccessor是一个接口,有两个实现:“本地实现”和“委派实现”。只要通过Method.invoke()来调用反射就会生成一个委派实现,只是这个委派实现就是“本地实现”,进入到jvm虚拟久就有方法的地址,该地址指向目标方法,反射只是把参数准备好,然后在调用目标方法。
package jvm.java7method;
import java.lang.reflect.Method;
public class MethodTestV0 {
public static void target(int i) {
new Exception("#" + i).printStackTrace();
}
public static void main(String[] args) throws Exception{
Class<?> classTestVo = Class.forName("jvm.java7method.Metho