【问题标题】:Calling a function from the value of a string Java [duplicate]从字符串Java的值调用函数[重复]
【发布时间】:2013-01-03 22:40:54
【问题描述】:

可能重复:
How do I invoke a java method when given the method name as a string?

**我看过这个:Call a function from a string array (Java or Groovy),但它对我不起作用,也许这是我的场景*

我有一个带有一些值的字符串数组,我希望能够调用一个方法,它是这些值之一,当然这可以改变,我可能有 100 个值,所以使用它是不可行的if/else if 构造或 switch 语句。

有什么方法可以调用该方法,如我所愿,如下面的代码所示?

private String[] = {"Hit","Slap","Blop"};
private String et = "Slap";

    public void Action(){

        for(int i = 0; i < arr.length;i++){
            if(et.equals(arr[i])){
                //Call method of that name ( Slap(); )

            }
        }   
    }

    public void Run(){
        ///
    }

    public void Slap(){
        ///
    }

    public void Blop(){
        ///
    }

编辑:我尝试整合反射:

              for(int i = 0; i < arr.length;i++){
            if(et.equals(arr[i])){
                //Call method of that name
                 try {
                    method = this.getClass().getMethod(arr[i]);

                } catch (NoSuchMethodException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (SecurityException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                try {
                    return (String) method.invoke(this);
                } catch (IllegalAccessException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IllegalArgumentException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }
        }
        return "FAIL";

【问题讨论】:

  • 为什么反射不起作用?
  • 您对反射进行了哪些尝试?实际告诉我们你累了什么,而不是在明确的反思有效时说它不起作用,这会很有帮助。
  • 如果你调用的是et标识的方法,为什么还要在数组中查找呢?
  • 第一条评论中接受的答案会起作用。在您的情况下,您可以将他们使用“obj”的位置更改为“this”,因为您的方法在当前类中。
  • 如果方法对象为空,则不能调用它。它不返回任何值,因此不要强制转换并返回结果。将您的 getMethod 和调用放在一个 try 块中...

标签: java arrays reflection methods invoke


【解决方案1】:

您将不得不使用反射。像这样的:

getClass().getMethod(arr[i]).invoke(this);

【讨论】:

  • -- 也使用这个。都一样。
【解决方案2】:

您可以使用 ReflectionAPI 来实现这一点。只需从您想要的类(如果可用)中获取具有此名称的方法并使用您的 args 调用它,在本例中为 null。

但这是一个糟糕的设计,您应该重新考虑您的应用程序流程!

这是一个例子:

public class HelloWorld {

public static void main(String[] args) {
    HelloWorld hello = new HelloWorld();
    String[] calls = { "def", "abc", "ghi" };
    try {
        for (String call : calls) {
            Method method = HelloWorld.class.getMethod(call, null);
            method.invoke(hello, null);
        }
    } catch (Exception e) {
        // TODO: handle exception
    }
}

public void abc() {
    System.out.println("abc");
}

public void def() {
    System.out.println("def");
}

public void ghi() {
    System.out.println("ghi");
}

}

【讨论】:

  • 你认为什么设计不好?使用反射 API?
猜你喜欢
  • 2023-03-09
  • 1970-01-01
  • 2019-07-28
  • 2011-12-17
  • 2017-07-02
  • 2011-03-03
  • 2014-06-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多