反射时间维度的对比
都说反射慢,是基于类方法的直接调用进行对比的。
以下是一个博主的测试(人家的劳动成果还是要尊重的)。
下面这个就是一个博主的测试记录。【https://baijiahao.baidu.com/s?id=1699699191243005417&wfr=spider&for=pc】 之对于测试部分参考一下。
为什么慢?
根本原因是编译器没法对反射相关的代码做优化。
我们都知道 Java 代码是需要编译才能在虚拟机里运行的,但其实 Java 的编译期是一段不确定的操作过程。因为它可能是一个前端编译器(如 Javac)把 *.java 文件编译成 *.class 文件的过程;也可能是程序运行期的即时编译器(JIT 编译器,Just In Time Compiler)把字节码文件编译成机器码的过程;还可能是静态提前编译器(AOT 编译器,Ahead Of Time Compiler)直接把 *.java 文件编译成本地机器码的过程。
其中即时编译器(JIT)在运行期的优化过程对于程序运行来说更重要,Java虚拟机在编译阶段的代码优化就在这里进行,由于反射涉及动态解析的类型,因此无法执行某些Java虚拟机优化。因此,反射操作的性能要比非反射操作慢,因此应该避免在对性能敏感的应用程序中频繁使用Java反射来创建对象。
如何解决?
1.在需求设计上解决,能否用增加工作量换运行时间。
2.使用快速编译框架。
ASM 是一个 Java 字节码操控框架。它能被用来动态生成类或者增强既有类的功能。ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为。说白了asm是直接通过字节码来修改class文件。ASM 第一次生成字节码比仅使用反射慢,但是一旦生成了字节码,它便与普通Java代码一样快,并且将由JIT编译器进行优化。
ASM [https://www.bilibili.com/read/cv9803401/]