我有一个有助于调用已知方法的方法
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。为此做了什么工作?感谢
答案 0 :(得分:2)
问题是,getDeclaredMethod
不会为你做多态性。您必须明确地查看参数的所有超类和接口,并检查每个可能的签名。
也就是说,对于class C extends B
和class 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()