Java反射,获取参数类型

标签 java reflection parameters

我有一个方法callMethod,它接受参数:methodName (String) 和parameters(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 用于从外部源调用方法。当这些方法具有原始参数作为类型或接口(interface)(列表等)时,它似乎会失败,我知道为什么。

我的问题是: 有没有办法解决这个问题以保持这种/类似的方式,或者唯一的解决方案是将类型信息(例如用于基元的 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 相同,但您需要确保它们清晰可见。

关于Java反射,获取参数类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14192323/

相关文章:

java - 在 ANT 构建中添加文件(Tomcat 服务器)

java - 在 Java/JNLP 中加载资源的可靠方法

reflection - Kotlin 绑定(bind)的可调用引用不一致

delphi - 传递序数参数

javascript - 如何在 JavaScript 中将函数作为参数传递?

mysql - 将参数从批处理文件传递到 MYSQL 脚本

java - 将自定义 ListView 添加到 fragment

java - @Consumes( {"application/xml,application/json"}) 如何编程返回类型

java - 在调用时使用Java函数注解来调用外部代码

java - 如何 "proxy"Java中的一个方法