簡體   English   中英

Java反射getDeclaredMethod類檢查

[英]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 Bclass 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM