这是一个学术练习(免责声明)
我正在构建一个应用程序,它将尽可能快地从中获利,因为它将与其他应用程序竞争。
我知道使用反射声明一个类(下面的例子)会比使用标准声明遭受巨大的损失。
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
}
无论如何,如果我在这里误解了或者错了,请告诉我。