我正在编写一个使用反射来动态查找和调用方法的库。只要给定一个对象、一个方法名和一个参数列表,我就需要调用给定的方法,就好像方法调用是在代码中显式编写的一样。
我一直在使用以下方法,在大多数情况下都有效:
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);
}
但是,当其中一个参数是该方法支持的类型之一的子类NoSuchMethodException
时,反射 API 会抛出一个. 例如,如果接收者的类已testMethod(Foo)
定义,则以下失败:
receiver.getClass().getMethod("testMethod", FooSubclass.class).invoke(receiver, new FooSubclass());
即使这有效:
receiver.testMethod(new FooSubclass());
我该如何解决这个问题?如果方法调用是硬编码的,则没有问题 - 编译器只是使用重载算法来选择要使用的最佳适用方法。但是,它不适用于反射,这正是我所需要的。
提前致谢!