我有一个方法callMethod,它接受参数:methodName (String)和参数(Object[])。现在,一开始我似乎一切都很好,但我偶然发现了一个问题。你必须知道对象的类型才能使用反射。到目前为止,我是这样确定的:
Class[] getParameterTypes(Object[] parameters) {
Class[] parameterTypes = new Class[parameters.length];
for (int i = 0; i < parameters.length; i++) {
parameterTypes[i] = parameters[i].getClass();
}
return parameterTypes;
}
callMethod用于从外部源调用方法。当这些方法具有基本参数作为类型或接口(列表等)时,它似乎失败了,我知道为什么。
我的问题是:是否有任何方法可以让它保持类似的方式,或者唯一的解决方案是传递类型信息(例如Integer)。TYPE(原语等)到上面提到的方法:
callMethod(String methodName, Object[] parameters, Class[] parameterTypes);
谢谢你的帮助
如果调用者期望基于其变量类型的重载解析,那么您的代码也会失败。例如:
void foo(String x) {}
void foo(Object x) {}
Object x = "text";
foo(x);
…将调用foo(Object)
而不是foo(String)
,但您的反射代码将调用foo(String)
。
现在,我们对你的用例并没有足够的了解来判断这是否是个问题。如果调用者确实知道他们想调用哪个方法,使用哪个参数类型,那么最好是传递它们。
如果上面的情况不会在您的上下文中发生,您可能希望在反射代码中执行某种基本的重载解析:
- 查找所有具有正确名称和正确编号参数的方法。
- 检查每个方法,看看是否所有的参数值都可以分配给相应的参数类型(参见
Class.isAssignableFrom
-你可能需要单独处理原语)。 - 如果有多个匹配方法,应用一些规则来确定调用哪个。这些规则不必和Java一样,但你需要确保它们是清晰的。