2013-05-14 89 views
2

我想通過反射下面的方法來打電話,但我有問題指定正確的簽名:泛型列表和反思

public void executeRule(List<Node> params, SomethingStrangeFound callMeBack) throws IOException 
{ 
     ... 
} 

我想是這樣的:

Class partypes[] = new Class[2]; 
partypes[0] = Class.forName("java.util.List");     
partypes[1] = Class.forName("vp.SomethingStrangeFound"); 

Method meth = cls.getMethod("executeRule", partypes); 

它不起作用,因爲我使用「java.util.List」時,它必須是「列表<節點>」,但我不知道如何指定它。

如果我只是用 「java.util.List的」,我有以下錯誤調用cls.getMethod( 「executeRule」,partypes):

NoSuchMethodException: vp.RuleWebXmlContextParamFacesPortletRenderStyles.executeRule(java.util.List, vp.SomethingStrangeFound) 

任何幫助嗎?

P.S. 在調試的時候,我看到 「列出<節點>」 與解決: (Ljava/UTIL /列表< Lorg/W3C/DOM /節點; >;點亮/ VP/SomethingStrangeFound;)V

,但它不幫不了我。

+3

在運行時,由於類型擦除,它將成爲'java.util.List',所以它一定不是問題。 – 2013-05-14 16:31:40

+1

''partypes''數組的長度應該等於1,你也可以簡化你的代碼到'Class partypes [] = new Class [] {List.class};' – hoaz 2013-05-14 16:34:12

+0

@Luiggi它給我帶來一個問題,因爲當我調用getMethod 「executeRule」,partypes)我收到一個異常:NoSuchMethodException,因爲類型不同。 – 2013-05-14 16:43:03

回答

2

我跑你的代碼,它爲我工作。 您沒有提供CLS的定義,但我相信它是一樣的東西

Class cls = RuleWebXmlContextParamFacesPortletRenderStyles.class; 

既然你得到一個NoSuchMethodException,已經調用Class.forName順利通過,所以沒有錯字存在(除非你有多個SomethingStrangeFound類,意味着你弄錯了包裝)。

正因爲如此,我想到的最後一件事情是您可能在添加有問題的方法之前編譯了RuleWebXmlContextParamFacesPortletRenderStyles。清理你的代碼並重新編譯。

+0

是的你是對的,我只是搞砸了包。現在看來工作。所有建議使用List.class或java.util.List的人都是對的。 – 2013-05-15 08:37:37

0

隨着大小爲2 partypes,getMethod將搜索名爲「executeRule」有兩個參數,類型「的java.util.List」之一,和其他類型的「vp.SomethingStrangeFound」

但你的方法方法只有1個參數。你需要類型的第二個參數「vp.SomethingStrangeFound」添加到你的方法或設置partypes大小爲1

+0

對不起,我給出了刪除第二個參數的代碼的簡化版本,因爲它不會帶來麻煩。然而,爲了更加連貫,我使用這兩個參數再次編輯了這篇文章。 – 2013-05-14 16:56:01

+0

@DuccioFabbri我在編輯前嘗試了你的文章中的代碼(只有列表作爲參數)並且工作正常。也許問題出在「vp.SomethingStrangeFound」? – Evans 2013-05-14 16:59:44

3

如果這兩個參數的類可在編譯時可以初始化參數數組是這樣的:

Class partypes[] = new Class[] { List.class, SomethingStrangeFound.class }; 
Method meth = cls.getMethod("executeRule", partypes); 

這將保證您沒有鍵入合格的類名。

如果這樣仍然不能正常工作,請檢查您使用的類#類的getMethods()可用的方法方法:

for (Method method : cls.getMethods()) { 
    System.out.println(method); 
}