使用反射创建对象而不是调用类构造函数会导致任何显着的性能差异吗?
是的,一点没错。 从数量上看 ,通过反射查找课程的成本更高。
引用Java 的关于反射的文档:
由于反射涉及动态解析的类型,因此无法执行某些 Java 虚拟机优化。因此,反射操作的性能比它们的非反射对应物慢,并且应该避免在对性能敏感的应用程序中频繁调用的代码部分中。
这是我在我的机器上用 5 分钟完成的一个简单测试,运行 Sun JRE 6u10:
public class Main { public static void main(String[] args) throws Exception { doRegular(); doReflection(); } public static void doRegular() throws Exception { long start = System.currentTimeMillis(); for (int i=0; i<1000000; i++) { A a = new A(); a.doSomeThing(); } System.out.println(System.currentTimeMillis() - start); } public static void doReflection() throws Exception { long start = System.currentTimeMillis(); for (int i=0; i<1000000; i++) { A a = (A) Class.forName("misc.A").newInstance(); a.doSomeThing(); } System.out.println(System.currentTimeMillis() - start); } }
有了这些结果:
35 // no reflection 465 // using reflection
请记住,查找和实例化是一起完成的,在某些情况下可以重构查找,但这只是一个基本示例。
即使您只是实例化,您仍然会受到性能影响:
30 // no reflection 47 // reflection using one lookup, only instantiating
再次,YMMV。