Java反射,获取参数类型



我有一个方法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一样,但你需要确保它们是清晰的。

相关内容

  • 没有找到相关文章

最新更新