2014-05-18 113 views
1

我有幫助調用已知方法的方法Java反射getDeclaredMethod類檢查

public static void invoke(Object object, Class<?> callingClass, String methodName, Object[] param) 

我能夠調用此

for (Method method : callingClass.getDeclaredMethods()) { 
    if (method.getName().equals("bla")) { 
     method.invoke(object, param); 
    } 
} 

但是,當我試着打

Class[] paramClass = new Class[param.length]; 
for (int i = 0; i < paramClass.length; i++) { 
    paramClass[i] = Class.forName(param[i].getClass().getName()); 
} 
Method method = callingClass.getDeclaredMethod(methodName, paramClass); 

我遇到了java.lang.NoSuchMethodException。 ,我試圖調用的方法是

public void bla(String[] arg, Map<String, String[]> argContext); 

我在我的「調用」方法的上方通過,只是爲PARAM,陣列由一字符串[]的對象,和一個地圖對象從類別中檢索.unmodifiableMap(source)

我猜這個問題來自於我的輸入是UnmodifiableMap,其中bla方法需要一個常規的Map。這有什麼工作?謝謝

回答

2

的問題是,getDeclaredMethod不會爲你做的多態性。你必須明確地通過你的參數的所有超級類和接口,並檢查每個可能的簽名。

也就是說,class C extends Bclass B extends A你必須檢查method(C c)method(B b)method(A a)(如果你發現任何,它可以與C型的參數調用)。您實際上必須親自計算「距離」並決定什麼是最適合的實現:如果您找到實現方法(B,A)和實現方法(A,B),並且您想用它調用它參數(C,C),那麼決定哪種方法適用於您,即您要麼調用getDeclaredMethod(A.class,B.class)或getDeclaredMethod(B.class,A.class),並且兩者都可以是用你的類型(C,C)的參數來調用。

1

Map是一個接口。因此,Map的每個實例都具有與Map.class不同的具體類別,並且getClass()方法不返回Map.class。但對於實際返回的Class,沒有與簽名匹配的方法。你


可能還需要改變

Class.forName(param[i].getClass().getName()) 

param[i].getClass() 
+0

param [i] .getClass()確實簡化了一點。 但是有沒有解決這個問題的方法?我只想在傳入參數的情況下調用該方法。 – vda8888