Java反射运行时性能

Fra*_*kie 11 java reflection performance

这是一项学术性的练习(免责声明).

我正在构建一个应用程序,它将尽可能快地获利,因为它将与其他人竞争.

我知道使用反射声明一个类(下面的示例)将遭受巨大的惩罚而不是标准声明.

Class mDefinition = Class.forName("MySpecialClassString");
Constructor mConstructor = mDefinition.getConstructor(new Class[]{MySpecialClass.class});
myClass = (MySpecialClass) mConstructor.newInstance(this);
Run Code Online (Sandbox Code Playgroud)

然而,在宣布myClass我是否以标准方式使用它之后,myClass.myMethod() 我是否也会遭遇性能损失,或者它是否会像我以标准方式宣布该类一样?

Rev*_*nzo 14

首次实例化对象时会有性能损失.一旦加载了类,它就像它已经正常实例化一样,并且不会有进一步的性能损失.

更进一步,如果使用反射调用方法,将会有性能损失大约十五次(Java中的默认值),之后反射调用将由JVM重写为与静态编译的调用完全相同.因此,一旦JVM重新编译了该字节码,即使重复反映的方法调用也不会导致性能下降.

有关详细信息,请参阅以下两个链接:


Chr*_*son 7

上课后你应该没问题.开销与检查表示类等的运行时结构相关联.以标准方式调用方法应该没问题,但是如果您开始按名称或签名搜索方法,则会产生额外的开销.