【发布时间】:2020-06-04 06:27:28
【问题描述】:
嘿,所以我有一个很长的 switch 语句,它调用一个基于这样的字符串的方法
private void callMethod(String name) {
switch(name) {
case "blah":
blah();
break;
case "method":
method()
break;
}
}
等等
所以我用反射来缩短代码
try {
Method method = ClassName.class.getDeclaredMethod(name, args);
method.invoke(args);
} catch (NoSuchMethodException e) {
// switch default
}
只是想知道使用这样的反射是否对内存/性能不利。我只是偶尔调用这个函数。
编辑:我使用它的原因是因为用户可以选择根据他们输入的字符串来启动游戏的不同部分。启动事件的每个方法都以他们需要输入的内容命名。
【问题讨论】:
-
如果用户有能力控制你的 call 方法函数的输入是有风险的,因为它可能会暴露他们不打算运行的代码。
-
反射确实会对应用程序的性能产生影响,可以使用分析器来确定精确的差异。但是,这似乎是一个 xy 问题 (en.wikipedia.org/wiki/XY_problem)。你能描述一下导致你创建这个函数的需求吗?可能有一种解决方案既不需要硬编码的 switch 语句也不需要反射代码。
-
很难在没有看到您的用例的情况下回答。如果这只是在内部调用并且性能无关紧要,反射可能是一个很好的解决方案。
-
该类中唯一的方法是我想要调用的方法。没有他们可以调用的非预期方法。我调用这个函数的方式是当用户输入他们自己的字符串时。每种方法开始游戏的不同部分。
-
几乎没有关于是什么促使您编写这段代码的输入,但是为什么您不执行以下操作而不是
new MyClass(). callMethod("foo"):new MyClass(). foo()
标签: java performance memory reflection switch-statement