反射调用,Method.invoke方法,实际上委派给MethodAccessor来处理。有两个具体实现:一个通过本地方法,一个使用委派模式。
    每个Method实例的第一次反射调用都会生成一个委派实现,它所委派的具体实现便是一个本地实现。

    本地实现
    当进入jvm内部之后,我们能知道method实例所指向方法的具体地址,反射调用无非就是将传入的参数准备好,然后调用进入目标方法。
    具体流程:反射调用先调用了Method.invoke,然后进入委派实现(DelegatingMethodAccessorImpl),再进入本地实现(NativeMethodAccessorImpl),最后到达目标方法。

    为什么要采取委派实现?
    Java反射调用机制还设立了另一种动态生成字节码的实现(动态实现),直接使用invoke指令来调用目标方法。之所以采用委派实现,是为了能够在本地实现和动态实现中切换。
    动态实现的效率要比本地实现高的多。

    在反射调用15次之后,委派实现便会将委派对象切换至动态实现。动态实现的字节码是自动生成的,它将直接使用invoke指令来调用目标方法。

    方法的反射调用会带来不少性能开销,主要原因有三个:变长参数方法导致的Object数组,基本类型的自动装箱、拆箱,方法内联。