2

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

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

或反思:

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

哪种方法更有效?

4

7 回答 7

4

反射肯定不会更快,因为它必须经过额外的层。

但是,将反射用于此类任务将是错误的方式,因为它使代码更难维护,并且不能满足反射设计的真正目的。

于 2013-06-17T10:40:13.503 回答
2

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

如果您有无限数量的方法,则可以使用反射(可能您没有任何其他选择)。您仍然可以通过缓存MethodgetMethod().

请注意,通过反射传递参数总是会创建额外的Classes 和Objects 数组。

于 2013-06-17T10:54:05.643 回答
1

如果您正在寻找更快的性能,反射会产生很大的开销。根据Oracle Java 教程

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

Java VM 具有特殊的字节码,可用于类似lookupswitchtableswitch.

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

于 2013-06-17T10:38:50.277 回答
1

反射总会有一些开销

来自javadoc

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

于 2013-06-17T10:39:37.640 回答
0

使用开关

反射很强大,但不应该乱用。如果可以在不使用反射的情况下执行操作,那么最好避免使用它。

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

于 2013-06-17T10:39:24.277 回答
0

最好使用 switch 选项,因为与内存相比,反射很重。如果这种情况不可用,以便您可以在 switch 语句中处理,而在反射中您有输入示例 * 所以它会查找不可用的方法 method* 可能是。

于 2013-06-17T10:39:41.823 回答
-1

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

但是在这里你没有这种情况,所以最好使用 switch而不是反射

并避免不必要的流程负担。

于 2013-06-17T10:45:58.367 回答