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