【问题标题】:What are the different ways to call methods dynamically in java [closed]在java中动态调用方法有哪些不同的方法[关闭]
【发布时间】:2016-03-11 13:04:16
【问题描述】:

界面:

interface A
{
   void run(String methName);
}

类:

class X implements A
{
    void run(String methName)
    {

    }
    void m1()
    {

    }
    void m2()
    {
    }
    void m3()
    {

    }

}

我想在不使用反射机制的情况下从run方法中通过名称动态调用m1、m2和m3方法

【问题讨论】:

  • 就叫他们...?
  • 请解释您所说的“动态”是什么意思以及为什么不能选择反射。
  • 在我们将方法名称作为参数传递的意义上动态地,
  • 你忘了说为什么反射不是一个选项。

标签: java methods reflection invoke


【解决方案1】:

别想太多:

switch (methName) {
  case "m1": m1(); break;
  case "m2": m2(); break;
  case "m3": m3(); break;
  default: throw new AssertionError();
}

如果你想做一些更安全的事情,你可以定义一个策略枚举,比如:

enum Strategy {
  M1 { @Override public void run(X instance) { instance.m1(); } },
  M2 { @Override public void run(X instance) { instance.m2(); } },
  M3 { @Override public void run(X instance) { instance.m3(); } };

  public abstract void run(X instance);
}

然后

 void run(Strategy strategy) {
   strategy.run(this);
 }

现在您不能传入任意方法名称,但仅限于 Strategy 的实例。

【讨论】:

  • 我现在才注意到这一点,但称其为“甲基”是……一个有趣的决定
  • 这里我们是硬编码,但如果我们有 20 个方法,那我们会做什么?
  • 复制并粘贴这些行 20 次,然后继续你的生活 :)
  • 或者使用反射。
【解决方案2】:

this post中所述,

反射是一种语言在运行时检查和动态调用类、方法、属性等的能力。

所以说你想在没有反射的情况下进行反射是没有意义的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-06
    • 2012-01-07
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多