【问题标题】:Can Java dereference a statement? [duplicate]Java 可以取消引用语句吗? [复制]
【发布时间】:2020-05-24 08:29:01
【问题描述】:

Java 可以做这样的事情吗?:

String methodName = "multiply";

MyMath myMath = new MyMath();

/* "methodName" is expanded before being called */
int answer = myMath.methodName(2, 3);    

System.out.println(answer);

6

这种类型的功能/概念是否在称为“动态扩展”、“变量插值”、eval()(例如在各种脚本语言中)、反射、内省、Java bean 的编程语言中?

【问题讨论】:

  • 据我所知,你不能。为什么需要它?
  • @c-an - 好吧,我正在尝试将方法名称放在属性文件中,例如。 "methodName = multiply" 然后在程序中调用它,而无需对其进行硬编码或使用 switchif ... else if 或工厂设计模式。
  • 我猜在这种情况下,您需要使用参数并实现您想要实现的。
  • 感觉像Strategy Pattern

标签: java


【解决方案1】:

Java 没有将此行为作为标准语言功能提供,但可以通过 the Reflection API 实现:

MyMath myMath = new MyMath();
String methodName = "multiply";
Method m = MyMath.class.getMethod(methodName);
m.invoke(myMath, 2, 3);

【讨论】:

  • 同调用函数,根据条件告诉该做什么。
  • 话虽如此,请注意使用反射的需要通常表明设计/架构不好。所以如果可能的话,首先考虑重构你的代码。
【解决方案2】:

是的,这可能是反射,但是性能很差(在Java Reflection Performance 中确认)。

关于反射的说明:https://www.oracle.com/technical-resources/articles/java/javareflection.html

本文介绍了如何使用反射。对您来说,“按名称调用方法”部分是最有趣的,但我建议阅读整篇文章。

【讨论】:

  • “但是性能很差”引用?
  • 这来自我的个人经验。快速搜索让我得到了这个确认:stackoverflow.com/questions/435553/java-reflection-performance。当然甲骨文不会告诉你他们产品的坏处。
  • 我不会说任何人,包括甲骨文,都试图故意隐瞒这一事实。由于它的实现方式,它并没有那么快。现在更多的是技术限制。并且正在努力通过更新版本来改变这一点。
猜你喜欢
  • 1970-01-01
  • 2011-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-18
相关资源
最近更新 更多