0

testMethod(String test1, String test 2) という名前のクラスとメソッドがあるとします。私はまた、それが含まれているメソッドを呼び出す別のメソッドを持つ別のクラスを持っています。以下の例を参照してください

public class functional {

    testMethod(String test1, String test2) {

        reCallMethod();

    }
}

reCallMethod(){
    testMethod(test1, test2); // ------> This has to be dynamic. I've written the method name as "testMEthod" here. But I want it generalized so that I can use this in any method and not just in "testMethod"
}

詳しくは : - - - - - - - - - - - - - - - -

public class test1 {
public void TestCase1(String param1, String param2, String param3) {
        try {
            //Bla Bla Bla
        }
        catch (Throwable t) {
                TestCase_Store_Locator_Verify_Page_Name(param1,param2,param3); //Retry running this method

        }
    }
}

public class test2 {
    public void TestCase2(String param1, String param2, String param3, String param4, String Param5) {
        try {
            //Bla Bla Bla
        }
        catch (Throwable t) {
                TestCase2(param1,param2,param3,param4,param5); //Retry running this method

        }
    }
}

TestCase1 と TestCase2 のように、500 個のテストがあります。上記を行う代わりに、以下のような retryLogic と呼ばれる一般的なメソッドがあります

public void retryLogic(){
 //Call the test method in the class which this method is placed.
}


So my TestCase1 will look like

    public class test1 {
public void TestCase1(String param1, String param2, String param3) {
        try {
            //Bla Bla Bla
        }
        catch (Throwable t) {
                retryLogic(); //Retry running this method

        }
    }
}


    public void TestCase2(String param1, String param2, String param3) {
        try {
            //Bla Bla Bla
        }
        catch (Throwable t) {
                retryLogic(); //Retry running this method

        }
    }
}
4

6 に答える 6

1

Reflection を使用して、実行時に呼び出すメソッドを決定できます。

その方法については、次の投稿を参照してください: メソッド名が文字列として指定されたときに Java メソッドを呼び出すにはどうすればよいですか?

于 2013-01-23T20:28:58.740 に答える
1

Java のリフレクション機能をご覧ください。

于 2013-01-23T20:29:14.860 に答える
0

リフレクションを使用したくない場合は、ストラテジー パターンという別の可能性があります。リフレクションとまったく同じ機能を提供するわけではありませんが、実行時に呼び出すメソッドを変更する可能性があります。クラスで正しいメソッドを呼び出すクラスを使用できますfunctional

たとえば、functionalクラスに次の定義があるとします。

public class functional {
    public void testMethod (String test1, String test2) {
        reCallMethod();
    }

    public void anotherMethod (String test1, String test2) {
        reCallMethod();
    }
}

戦略インターフェースを定義するインターフェースを持つことができます:

public interface MyStrategy {
    void callMethod (String param1, String param2);
}

次に、2 つの異なる戦略を実装します。呼び出すメソッドごとに 1 つ。例えば:

public class TestMethodStrategy implements MyStrategy {
    private functional myFunctional;

    public TestMethodStrategy (functional myFunctional) {
        this.myFunctional = myFunctional;
    }

    public void callMethod (String test1, String test2) {
        myFunctional.testMethod (test1, test2);
    }
}

後で行う必要があるのは、現在のコンテキストに応じて適切な戦略を使用することだけです。

于 2013-01-23T20:43:51.660 に答える
0

たぶん、同じことをするこれを行うことができます:

  public void TestCase2(String param1, String param2, String param3) {
        boolean success;
        do {
            success = true;
            try {
                //Bla Bla Bla
            }
            catch (Throwable t) {
                success = false;
            }
        } while (!success);
    }

カウンターを追加して、永久に実行されないようにすることもできます. break20回試行した後などにインクリメントして実行するものだけです。

それについての大きなプラスは、すでに他のコードが書かれている場合です。メソッドの先頭の最初の 4 行をコピーして貼り付け、末尾の最後の 5 行をコピーして貼り付けて、既存のコード内で例外がキャッチされたり食べられたりしていないことを確認します。

于 2013-01-23T22:00:15.173 に答える
0

Java では、メソッドへの参照を保持する変数を持つ方法はありません。javascript などの他の一部の言語では、これが可能です。

既知のメソッド名を持つインターフェイスを実装する「reCallMethod()」にオブジェクトを渡す場合、これに対する冗長な回避策があります。通常、インターフェイスは次のようになります。

public interface CallMe() {
    public Object execute(Object parm1, Object parm2);
}

ただし、「execute」の戻り値とパラメーターは、ニーズによって異なる場合があります。

次に、コードは次のようになります。

public class functional {

    final OtherClass otherInstance = new OtherClass();

    testMethod(String test1, String test2) {

        reCallMethod(new CallMe() {
            public Object execute(Object parm1, Object par2) {
                return otherInstance.varyingMethod((String)parm1, (String)parm2); // This is the varying method
            }
        }, text1, text2);
    });
}

reCallMethod(CallMe func, Object parm1, Object parm2){
    func.execute(parm1, parm2);
}
于 2013-01-23T20:34:42.187 に答える
0

Java リフレクションを使用して、クラスのメソッドを検索できます。したがって、 clazz.getMethods() は Method オブジェクトの配列を返します。興味のあるものを特定したら、method.invoke(...) を呼び出します。これを参照してください: http://docs.oracle.com/javase/tutorial/reflect/class/classMembers.html

于 2013-01-23T20:32:22.807 に答える