1

重複の可能性:
メソッド名が文字列として指定された場合、Java メソッドを呼び出すにはどうすればよいですか?

**私はこれを見てきました:文字列配列(JavaまたはGroovy)から関数を呼び出しますが、うまくいきませんでした。おそらくそれは私のシナリオです*

いくつかの値を持つ文字列配列があり、それらの値の 1 つであるメソッドを呼び出せるようにしたいのですが、もちろんこれは変更される可能性があり、数百の値を持つ可能性があるため、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";
4

2 に答える 2

2

ReflectionAPIを使用してこれを実現できます。目的のクラス(使用可能な場合)からこの名前のメソッドを取得し、引数(この場合は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");
}

}

于 2013-01-20T20:53:24.513 に答える
2

リフレクションを使用する必要があります。このようなもの:

getClass().getMethod(arr[i]).invoke(this);
于 2013-01-20T20:50:41.900 に答える