java:开关或反射效率更高吗?

时间:2013-06-17 10:37:21

标签: java performance reflection switch-statement

从jsp我得到一个可用于开关的字符串

switch(value)
case 0: method0(); break;
case 1: method1(); break;
...

或反思:

c.getMethod("method"+value, parameter);
...

哪种方法更有效?

7 个答案:

答案 0 :(得分:4)

反射肯定不会更快,因为它必须通过其他图层。

然而,对这样的任务使用反射将是错误的方式,因为它使代码更难维护,并且不能实现反射设计的真实目的。

答案 1 :(得分:1)

如果您正在寻找更快的性能,那么反射会有很大的开销。根据{{​​3}}:

  

由于反射涉及动态解析的类型,因此无法执行某些Java虚拟机优化。因此,反射操作的性能低于非反射操作,应避免在对性能敏感的应用程序中频繁调用的代码段中。

Java VM具有特殊字节码,可用于lookupswitchtableswitch等切换案例。

如果能够实现的最佳方法是 Polymorphism ,面向对象的方法。

答案 2 :(得分:1)

反思总会有一些开销

来自javadoc

  

因为反射涉及动态解析的类型,   无法执行某些Java虚拟机优化。   因此,反射操作的性能比它们慢   非反射对应物,应避免代码部分   在性能敏感的应用程序中经常调用它们。

答案 3 :(得分:1)

如果你有固定数量的方法并且只是 lazy 来输入1000个不同的case s,那么你肯定会使用switch ,因为该语句在JVM字节码级别上进行了高度优化。

如果你有无限数量的方法,你可以使用反射 (可能你没有任何其他选择)。您仍然可以通过缓存从Method获得的getMethod() 实例来加快这一过程。

请注意,通过反射传递参数总会创建额外的Class es和Object s数组。

答案 4 :(得分:0)

使用切换

  

反思很强大,但不应随意使用。如果可以在不使用反射的情况下执行操作,则优选避免使用它。

http://docs.oracle.com/javase/tutorial/reflect/index.html

答案 5 :(得分:0)

最好使用切换选项,因为与内存相比,反射很重。如果不可用的情况如此,你可以在反射中处理switch语句,你有输入*的例子,所以它寻找不可用的方法方法*。

答案 6 :(得分:0)

基本上先了解何时使用反射?它主要用于反射,以动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型。然后,您可以调用类型的方法或访问其字段和属性。

但是在这里你没有这样的情况,所以使用开关而不是反射

避免不必要的过程负担。