2013-01-23 86 views
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 

     } 
    } 
} 
+0

它看起來像你正在尋找[反射](http://docs.oracle.com/javase/tutorial/reflect/member/methodInvocation.html)。 – Pshemo

+0

它爲什麼會變成動態的? –

+0

請注意,在java中,按照慣例,類名以大寫字母開頭,方法名以小寫字母開頭。大多數人都遵循這些慣例。 –

回答

1
+0

謝謝!但在我的例子中,我有「testMethod」接受兩個參數。但是如果我有另一種方法稱爲「testMethod2」,它接受三個參數,我仍然想使用「reCallMethod」? –

+0

你可以用反射來做到這一點,看看方法的[invoke](http://docs.oracle.com/javase/6/docs/api/java/lang/reflect/Method.html#invoke(java.lang .Object,%20java.lang.Object ...))方法,它接受可變數量的參數。在運行時,當然你需要知道調用哪個方法以及需要多少參數。 – tttthomasssss

+0

你現在可以查看我編輯的信息,看看你能幫助我嗎?謝謝! –

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); 
} 
+0

你可否請現在檢查我的編輯信息,看看你能幫助我嗎?謝謝! –

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); 
    } 
} 

您以後需要做的所有事情都是根據當前上下文使用適當的策略。

+0

你現在可以檢查我編輯的信息,看看你能幫助我嗎?謝謝! –

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); 
    } 

你甚至可以添加一個計數器,以防止其運行下去。只是增加了一些東西,並在20次嘗試之後做了break或其他任何事情。

關於它的最大好處是,如果您已經有其他代碼編寫。您只需複製並超過方法頂部的前4行,並複製並越過底部的最後5行,並檢查是否沒有任何異常在現有代碼中被捕獲並被吃掉。