【问题标题】:Call a function from a string array (Java or Groovy)从字符串数组(Java 或 Groovy)调用函数
【发布时间】:2012-12-24 15:58:41
【问题描述】:

在 Java 或 Groovy 中,假设我有一个类似的字符串数组

myArray = ["SA1", "SA2", "SA3", "SA4"]

我想根据每个字符串调用不同的函数。

class Myclass{
  public static void SA1() {
    //doMyStuff
  }
  public static void SA2() {
    //doMyStuff
  }
  ...etc
}

我希望能够遍历我的数组并调用它们相关的函数,而无需比较字符串或进行 case 语句。例如有没有办法做如下的事情,我知道它目前不起作用:

Myclass[myArray[0]]();

或者,如果您有其他建议,我可以构建类似的内容。

【问题讨论】:

    标签: java reflection groovy


    【解决方案1】:

    在 groovy 中你可以这样做:

    Myclass.(myArray[0])()
    

    在 Java 中你可以这样做:

    MyClass.class.getMethod(myArray[0]).invoke(null);
    

    【讨论】:

    • 哈利路亚!我很高兴我正在使用 groovy。这正是我想要做的。
    • 在您的 java 示例中,当您调用该方法时,null 是什么?
    • 通常你想对对象执行方法。在这种情况下,您必须传递要使用的 object。但是在您的示例中,您使用的是静态方法,因此不需要对象。这就是为什么 null 被传递给 invoke 方法的原因。
    • @micha,为什么println Myclass.(myArray[0])() 有效,而myArray.each { println Myclass.(it)() } 无效?
    • 嗯,好问题,我不确定。 MyClass.(it.toString())() 工作
    【解决方案2】:

    在 Groovy 中,您可以使用 GString 进行动态方法调用:

    myArray.each {
      println Myclass."$it"()
    }
    

    【讨论】:

      【解决方案3】:

      例如,您可以声明一个接口,例如:

      public interface Processor
      {
          void process(String arg);
      }
      

      然后实现这个接口,例如在单例中。

      然后创建一个Map<String, Processor>,其中键是您的字符串,值是实现,调用时:

      Processor p = theMap.containsKey(theString)
          ? theMap.get(theString)
          : defaultProcessor;
      
      p.process(theString);
      

      【讨论】:

        【解决方案4】:

        我建议你看看反射 API,在运行时调用方法 检查Reflection docs

        Class cl = Class.forName("/* your class */");
        Object obj = cl.newInstance();
        
        //call each method from the loop
        Method method = cl.getDeclaredMethod("/* methodName */", params);
        method.invoke(obj, null);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-06-30
          • 1970-01-01
          • 2013-01-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多