Java反射运行时性能



这是一个学术练习(免责声明)

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

我知道使用反射声明一个类(下面的例子)会比使用标准声明遭受巨大的损失。

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

然而,在声明myClass之后,如果我以标准方式使用myClass.myMethod() ,我是否也会遭受性能消耗,或者它是否与我以标准方式声明该类相同?

第一次实例化对象时将会有性能损失。一旦类被加载,它就像正常实例化一样,不会有进一步的性能损失。

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

查看这两个链接了解更多信息:

    任何进一步优化Java反射方法调用的方法?
  • http://inferretuation.blogspot.com/2008/11/in-jit-we-trust.html

一旦类被加载,就应该没问题了。开销与检查表示类的运行时结构等有关。以标准方式调用方法应该没问题,但是如果开始按名称或签名搜索方法,就会产生额外的开销。

Chris Thompson的回答很中听。然而,我对你的代码示例感到困惑。

这将动态加载类:

Class mDefinition = Class.forName("MySpecialClassString");

这将为你的类获得一个Contructor,它将同一类的一个实例作为参数。还要注意,您是在编译时使用MySpecialClass.class:

访问类的。
Constructor mConstructor = mDefinition.getConstructor(new Class[]{MySpecialClass.class});

这是通过将this传递给构造函数来实例化MySpecialClass:

myClass = (MySpecialClass) mConstructor.newInstance(this);

基于构造函数参数,这是否意味着我们在MySpecialClass的实例方法中?非常困惑。

EDIT:这更接近我所期望看到的:

Class<?> mDefinition = Class.forName("MySpecialClassString");
//constructor apparently takes this as argument
Class<?> constructorArgType = this.getClass(); //could be ThisClassName.class
Constructor<?> mConstructor = mDefinition.getConstructor(constructorArgType);
MySpecialInterface mySpecialInstance = (MySpecialInterface)mConstructor.newInstance(this);

其中MySpecialInterface是用于与动态加载的类交互的接口:

interface MySpecialInterface {
    //methods used to interface with dynamically loaded classes
}

无论如何,如果我在这里误解了或者错了,请告诉我。

最新更新