Method.invoke -> 委派实现(DelegatingMethodAccessorImpl) -> 本地实现(NativeMethodAccessorImpl)
进入虚拟机后,便已经拥有了Method实例所指向方法的具体地址;这时,反射调用只需传入参数即可调用模板方法
动态生成字节码,直接使用invoke指令来调用目标方法
便于在 本地实现 和 动态实现中切换;
动态实现和本地实现相比,其运行效率要快20倍,因为动态实现无需经过Java到C++再到Java的切换,但是由于生成字节码十分耗时,仅调用一次的话,效率反而比本地实现快3到4倍
Java虚拟机设置一个阀值15(可通过 -Dsun.reflect.inflationThreshold=15 来调整),当反射调用的次数在15以下,采用本地实现,达到15后,便开始动态生成字节码,并将委派实现对象切换到动态实现,这个过程称为Inflation;反射调用的Inflation机制可通过参数(-Dsun.reflect.noInflation=true)来关闭,效果是反射调用从一开始就直接生成动态实现