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

您可以使用反射来确定在运行时调用哪个方法。

有关如何执行此操作的信息,请参阅此帖子: How do I invoke an Java method when given the method name as a string?

于 2013-01-23T20:28:58.740 回答
1

看看Java 的反射特性

于 2013-01-23T20:29:14.860 回答
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);
    }

你甚至可以添加一个计数器来防止它永远运行。只是增加并break在 20 次尝试后执行或其他操作。

如果您已经编写了其他代码,那么它的最大优点是。您只需复制并越过方法顶部的第 1 4 行,并复制并越过底部的最后 5 行,并检查现有代码中是否没有捕获和吃掉任何异常。

于 2013-01-23T22:00:15.173 回答
0

您可以使用 Java 反射来查找类上的方法。因此, clazz.getMethods() 将返回一个 Method 对象数组。当您确定您感兴趣的那个时,您会调用 method.invoke(...) 看到这个:http ://docs.oracle.com/javase/tutorial/reflect/class/classMembers.html

于 2013-01-23T20:32:22.807 回答
0

在 java 中,没有办法让变量持有对方法的引用。其他一些语言,例如 javascript,允许这样做。

如果您将对象传递到实现具有已知方法名称的接口的“reCallMethod()”中,则有一个详细的解决方法。通常界面看起来像这样:

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

尽管“执行”上的返回值和参数可能会因您的需要而异。

然后你的代码看起来像这样:

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

如果您不想使用反射,还有另一种可能性,即策略模式。它不提供与反射完全相同的功能,但您确实可以更改在运行时调用的方法。您可以使用将在您的类中调用正确方法的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种不同的策略实施;一个用于您要调用的每种方法。例如:

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 回答