2010-01-30 109 views
3

前一段時間使用Class.getMethod和自動裝箱時,我有一個similar question,這是有道理的在自己的查找算法來實現這一點。但真正讓我感到困惑一點是,以下是不工作之一:意外Class.getMethod行爲

public class TestClass 
{ 
    public String doSomething(Serializable s) 
    { 
     return s.toString(); 
    } 

    public static void main(String[] args) throws SecurityException, NoSuchMethodException 
    { 
     TestClass tc = new TestClass(); 
     Method m = tc.getClass().getMethod("doSomething", String.class); 
    } 
} 

String.class實現Serializable接口,我真的希望它是包括在查找方法。 我是否也必須在自己的查找算法中考慮這一點?

編輯:我看過的Javadoc,所以我要強調的問題的第二部分:如果是的話你有沒有對如何做到這一點快速(我已經添加一些自定義匹配建議並轉換算法,我不希望它變得太慢)?

回答

5

根據您的編輯,你可以利用Class#isAssignableFrom()。這裏有一個基本的開球例子(留下明顯時(runtime)異常處理除外):

package com.stackoverflow.q2169497; 

import java.io.Serializable; 
import java.lang.reflect.Method; 

public class Test { 

    public String doSomething(Serializable serializable) { 
     return serializable.toString(); 
    } 

    public static void main(String[] args) throws Exception { 
     Test test = new Test(); 
     for (Method method : test.getClass().getMethods()) { 
      if ("doSomething".equals(method.getName())) { 
       if (method.getParameterTypes()[0].isAssignableFrom(String.class)) { 
        System.out.println(method.invoke(test, "foo")); 
       } 
      } 
     } 
    } 

} 

這應該打印foo到標準輸出。

1

getMethod並不意味着以找到那些兼容與給定的參數類型的方法 - 它的意思是找到正是給定的參數類型的方法。

您需要致電getMethods()查找所有方法,然後按名稱和參數數量進行過濾,然後確定哪些方法實際適用。

0

你爲什麼會叫getMethodString.class?方法簽名被準確映射。按照相同的標準查找方法沒有任何意義,因爲您可以稱之爲方法。

4

Class.getMethod的Javadoc是非常明確的:

的parameterTypes參數是一個 陣列識別 方法的形參類型, 在聲明的順序Class對象。

它不提供子類型的範圍。