Skip to content

Latest commit

 

History

History
35 lines (13 loc) · 1.19 KB

03.反射的实现.md

File metadata and controls

35 lines (13 loc) · 1.19 KB

反射实现

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)来关闭,效果是反射调用从一开始就直接生成动态实现