我正在编写一个库,使用反射来动态查找和调用方法。只给定一个对象、方法名和参数列表,我需要像代码中显式地编写方法调用一样调用给定的方法。
我一直在使用以下方法,在大多数情况下都有效:
static void callMethod(Object receiver, String methodName, Object[] params) {
Class<?>[] paramTypes = new Class<?>[params.length];
for (int i = 0; i < param.length; i++) {
paramTypes[i] = params[i].getClass();
}
receiver.getClass().getMethod(methodName, paramTypes).invoke(receiver, params);
}
然而,当其中一个参数是该方法支持类型的子类时,反射 API 会抛出 NoSuchMethodException
异常。例如,如果接收者的类定义了 testMethod(Foo)
,以下示例将失败:
receiver.getClass().getMethod("testMethod", FooSubclass.class).invoke(receiver, new FooSubclass());
尽管这个有效:
receiver.testMethod(new FooSubclass());
如何解决这个问题?如果方法调用是硬编码的,那么没有问题——编译器只使用重载算法来选择最适用的方法。但是,使用反射就行不通了,而这正是我需要的。
提前致谢!