[英]Java reflection getDeclaredMethod class check
我有一個方法,可以幫助調用已知的方法
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);
我傳遞了上面的“invoke”方法,僅用於param,一個數組包含一個String []對象,一個從Collections.unmodifiableMap(source)檢索的Map對象
我想這個問題來自於我的輸入是UnmodifiableMap,其中bla方法需要一個常規Map。 為此做了什么工作? 謝謝
問題是, getDeclaredMethod
不會為你做多態。 您必須明確地查看參數的所有超類和接口,並檢查每個可能的簽名。
也就是說,對於class C extends B
和class C extends B
class 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)。
Map
是一個界面。 因此, Map
每個實例都有一個與Map.class
不同的具體類,而getClass()
方法不返回Map.class
。 但是對於實際返回的Class
,沒有與簽名匹配的方法。
你也可以想改變
Class.forName(param[i].getClass().getName())
至
param[i].getClass()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.