Java:使用switch还是反射更有效率?

3

我从jsp页面获取了一个字符串,可以用于switch语句

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

或者用于反射:
c.getMethod("method"+value, parameter);
...

哪种方法更有效?

3
反射使用起来成本较高,只有在没有其他方法时才应使用。 - undefined
3
你试过微基准测试吗?也就是编写代码并查看结果!我最初的猜测是开关 - 请注意,它假设更多,通常情况下,如果您假设得更多,则可以更快地运行! - undefined
7个回答

5

反射并不更快,因为它需要经过额外的层级。

然而,使用反射来完成这样的任务是错误的方式,因为它使得代码难以维护,并且没有真正实现反射设计的目的。


2
如果你有一定数量的方法,但懒得输入1000个不同的case,那么你肯定会使用switch语句,因为这个语句在JVM字节码级别上高度优化。
如果你有不确定数量的方法,你可以使用反射技术(可能没有其他选择)。你仍然可以通过缓存从getMethod()中获得的Method实例来加速此过程。
请注意,通过反射传递参数总是会创建额外的Class和Object数组。

1
Reflection的开销很大,如果你想要更快的性能。根据Oracle Java教程
因为反射涉及到动态解析的类型,某些Java虚拟机优化无法执行。因此,反射操作比非反射操作具有更慢的性能,并且应该在性能敏感的应用程序中频繁调用的代码段中避免使用。
Java VM有特殊的字节码可以用于类似switch-case的lookupswitchtableswitch
如果你能够实现,最好的方法是多态,面向对象的方法。

如果我从我的JSP页面中只得到一个告诉我要调用哪个方法的字符串,有没有办法使用多态性? - undefined
然后使用switch case,但我还没有理解你的设计! - undefined
这很简单,用户选择一个组合框,然后返回给我一个单一的字符串ID值,根据这个ID值,我需要调用不同的方法。 - undefined

1

反射总会有一些开销

来自javadoc

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


0

0
最好使用switch选项,因为与内存相比,反射的负担更重。而且如果没有可用的情况,你可以在switch语句中处理,而在反射中,如果输入的例子是*,它会寻找方法method*,但可能不存在。

和switch语句通常意味着某种形式的多态性,因此在使用时应该优先选择面向对象编程(OO),而不是switch。 - undefined

-1
基本上首先要了解何时使用反射?它主要用于动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型。然后可以调用该类型的方法或访问其字段和属性。
但在这种情况下,您没有这样的情况,所以最好使用switch而不是反射。
并避免不必要的负担。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接