2014-05-18 77 views
1

我有帮助调用已知方法的方法Java反射getDeclaredMethod类检查

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

我在我的“调用”方法的上方通过,只是为PARAM,阵列由一字符串[]的对象,和一个地图对象从类别中检索.unmodifiableMap(source)

我猜这个问题来自于我的输入是UnmodifiableMap,其中bla方法需要一个常规的Map。这有什么工作?谢谢

回答

2

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

也就是说,class C extends Bclass 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)的参数来调用。

1

Map是一个接口。因此,Map的每个实例都具有与Map.class不同的具体类别,并且getClass()方法不返回Map.class。但对于实际返回的Class,没有与签名匹配的方法。你


可能还需要改变

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

param[i].getClass() 
+0

param [i] .getClass()确实简化了一点。 但是有没有解决这个问题的方法?我只想在传入参数的情况下调用该方法。 – vda8888