从jsp我得到一个可以用于开关的字符串
switch(value)
case 0: method0(); break;
case 1: method1(); break;
...
或反思:
c.getMethod("method"+value, parameter);
...
哪种方法更有效?
从jsp我得到一个可以用于开关的字符串
switch(value)
case 0: method0(); break;
case 1: method1(); break;
...
或反思:
c.getMethod("method"+value, parameter);
...
哪种方法更有效?
反射肯定不会更快,因为它必须经过额外的层。
但是,将反射用于此类任务将是错误的方式,因为它使代码更难维护,并且不能满足反射设计的真正目的。
如果您有固定数量的方法并且您只是懒得输入 1000 个不同case
的 s,那么您肯定会使用switch
,因为该语句在 JVM 字节码级别进行了高度优化。
如果您有无限数量的方法,则可以使用反射(可能您没有任何其他选择)。您仍然可以通过缓存Method
从getMethod()
.
请注意,通过反射传递参数总是会创建额外的Class
es 和Object
s 数组。
如果您正在寻找更快的性能,反射会产生很大的开销。根据Oracle Java 教程:
由于反射涉及动态解析的类型,因此无法执行某些 Java 虚拟机优化。因此,反射操作的性能比它们的非反射对应物要慢,并且应该避免在对性能敏感的应用程序中经常调用的代码部分中。
Java VM 具有特殊的字节码,可用于类似lookupswitch
和tableswitch
.
如果您能够实现,最好的方法是Polymorphism,即面向对象的方法。
反射总会有一些开销
来自javadoc
由于反射涉及动态解析的类型,因此无法执行某些 Java 虚拟机优化。因此,反射操作的性能比它们的非反射对应物要慢,并且应该避免在对性能敏感的应用程序中经常调用的代码部分中。
使用开关
反射很强大,但不应该乱用。如果可以在不使用反射的情况下执行操作,那么最好避免使用它。
最好使用 switch 选项,因为与内存相比,反射很重。如果这种情况不可用,以便您可以在 switch 语句中处理,而在反射中您有输入示例 * 所以它会查找不可用的方法 method* 可能是。
基本上先明白什么时候用反射?它主要用于反射,以动态创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,您可以调用该类型的方法或访问其字段和属性。
但是在这里你没有这种情况,所以最好使用 switch而不是反射。
并避免不必要的流程负担。