Java反射getDeclaredMethod类检查

Java反射getDeclaredMethod类检查,java,reflection,Java,Reflection,我有一个方法可以帮助调用已知的方法 public static void invoke(Object object, Class<?> callingClass, String methodName, Object[] param) 但是当我试着打电话的时候 Class[] paramClass = new Class[param.length]; for (int i = 0; i < paramClass.length; i++) { paramClass[i]

我有一个方法可以帮助调用已知的方法

public static void invoke(Object object, Class<?> callingClass, String methodName, 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);
Class[]paramClass=新类[param.length];
for(int i=0;i
我遇到java.lang.NoSuchMethodException。 我尝试调用的方法是

public void bla(String[] arg, Map<String, String[]> argContext);
public void bla(字符串[]arg,映射argContext);
我将上面的“invoke”方法传递给了param,数组由String[]对象和从集合中检索到的Map对象组成


我想问题是因为我的输入是不可修改的映射,而bla方法需要一个规则映射。这方面的工作是什么?谢谢

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


你也可能想改变

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


问题是,
getDeclaredMethod
不能为您实现多态性。您必须显式地遍历参数的所有超类和接口,并检查每个可能的签名

也就是说,对于
类C扩展B
类B扩展A
,您必须检查
方法(C)
方法(B)
方法(A)
(如果找到任何方法,可以使用类型C的参数调用)

实际上,您必须自己计算“距离”,并决定什么是最适合的实现:如果您找到一个实现方法(B,A)和一个实现方法(A,B),并且您喜欢用参数(C,C)调用它,那么您就可以决定应用哪个方法,即,您可以调用getDeclaredMethod(A.class,B.class)或者getDeclaredMethod(B.class,A.class),两者都可以用类型为(C,C)的参数调用。

参数[i].getClass()确实稍微简化了它。但这有什么解决办法吗?如果可能的话,我只想通过传入的param调用该方法。
Class.forName(param[i].getClass().getName())
param[i].getClass()