Java反射getDeclaredMethod类检查

时间:2014-05-18 16:17:19

标签: java reflection

我有一个有助于调用已知方法的方法

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。为此做了什么工作?感谢

2 个答案:

答案 0 :(得分:2)

问题是,getDeclaredMethod不会为你做多态性。您必须明确地查看参数的所有超类和接口,并检查每个可能的签名。

也就是说,对于class C extends Bclass B extends A,您必须检查method(C c)method(B b)method(A a)(如果您找到,可以调用它)使用C)类型的参数。

你实际上必须计算&#34;距离&#34;你自己决定什么是最适合的实现:如果你找到一个实现方法(B,A)和一个实现方法(A,B),你想用参数(C,C)调用它,那么它取决于您可以决定使用哪种方法,即调用getDeclaredMethod(A.class,B.class)或getDeclaredMethod(B.class,A.class),并且可以使用类型(C,C)的参数调用它们。 / p>

答案 1 :(得分:1)

Map是一个界面。因此,Map的每个实例都具有与Map.class不同的具体类,而getClass()方法不会返回Map.class。但对于实际返回的Class,没有与签名匹配的方法。


此外,您可能想要更改

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

param[i].getClass()