【问题标题】:Java Reflection, getting parameter typesJava反射,获取参数类型
【发布时间】:2013-01-07 16:47:31
【问题描述】:

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

我的问题是: 有什么办法可以保持这种/类似的方式,或者唯一的解决方案是将类型信息(f.e Integer.TYPE 用于基元等)传递给上述方法:

callMethod(String methodName, Object[] parameters, Class[] parameterTypes);

感谢您的帮助。

【问题讨论】:

    标签: java reflection parameters


    【解决方案1】:

    如果调用者期望基于变量类型的重载解决方案,您的代码会失败。例如:

    void foo(String x) {}
    void foo(Object x) {}
    
    Object x = "text";
    foo(x);
    

    ... 将调用foo(Object) 而不是foo(String),但您的反射代码将调用foo(String)

    现在,我们对您的用例了解得还不够多,无法判断这是否是个问题。如果调用者确实确切地知道他们想要调用哪个方法,使用哪些参数类型,那么最好将它们传递给他们。

    如果上述情况不会在您的上下文中发生,您可能希望在反射代码中执行某种基本的重载解决方案:

    • 查找具有正确名称和正确数量个参数的所有方法。
    • 检查每个方法以查看是否所有参数值都可分配给相应的参数类型(请参阅Class.isAssignableFrom - 您可能需要单独处理原语)。
    • 如果有多个匹配方法,应用一些规则来确定调用哪个。这些规则不必与 Java 相同,但您需要确保它们是明确的。

    【讨论】:

      猜你喜欢
      • 2013-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-25
      相关资源
      最近更新 更多