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()