【问题标题】:Java reflection: array of classes vs. array of parameter typesJava 反射:类数组与参数类型数组
【发布时间】:2011-12-08 22:42:35
【问题描述】:

我有一个 Method 类的对象 m。我调用了m.getParameterTypes() 来创建方法参数的数组参数。

我还有一个对象数组 arr。我想检查 arr 中的对象是否与 params 中的类型相同(并且顺序相同)。

我所做的是创建一个数组类,其中包含 arr 中每个对象的类。然后我尝试将类与参数进行比较。事实证明它们永远不可能相等,因为 classes 数组中的类的格式为 java.lang.String,而 param 数组中的参数的格式为 String。如何比较数组?如何更改其中之一的格式?

【问题讨论】:

    标签: java reflection


    【解决方案1】:

    getParameterTypes() 返回Class<?>[],而实际参数本身将是对象(因此您将拥有Object[])。要检查参数是否有效,您可以使用:

    if (parameterTypes.length != arr.length) {
      // Invalid: wrong number of arguments
    }
    
    for (int i=0; i < parameterTypes.length; i++) {
      if (arr[i] == null && parameterTypes[i].isPrimitive()) {
        // Invalid: can't pass null for a primitive parameter
      } else if (arr[i] != null && !parameterTypes[i].isInstance(arr[i])) {
         // Invalid: invalid argument type
      } else {
         // Valid
      }
    }
    

    (当然,为有效/无效的情况做任何你需要做的事情。)

    【讨论】:

    • 很好的解决方案。 ...isInstance(arr[i]) 如果通过 null 将返回 false,因此无需先测试 arr[i]。也不要忘记验证 arr.length == parameterTypes.length 或者你会得到 IndexOutOfBoundsExceptions。
    • 检查空值的重点正是因为 isInstance 将返回false - 如果它是引用类型参数,则传入null 不是错误。不过我会添加长度检查...
    【解决方案2】:

    与其检查方法的参数是否与您的对象数组兼容,为什么不让Class.getMethod() 为您做呢?我的意思是,为什么不这样做:

    Class[] classes = new Class[myArr.length];
    for (int i=0; i<myArr.length; i++) {
        classes[i] = myArr[i].getClass();
    }
    
    Method m = YouMethodsClass.class.getMethod("methodName", classes);
    

    那不适合你吗?

    【讨论】:

      【解决方案3】:

      如果您要进行这种比较,您应该使用完全限定名称('java.lang.String' 类型)来确保匹配确实正确(因为两个类可以具有相同的“简单”名称并且来自不同的包)。

      您能否提供您使用的代码,以便我们指导您需要更改哪些内容以获得完全限定名称?

      方法 getParameterTypes() 返回一个 Class[],因此每个元素都是一个 Class。您可以调用 getCanonicalName()(或 getName() 在某些情况下,请参阅 javadoc for Class)来获取完全限定名称。

      对于对象数组,可以调用object.getClass().getCanonicalName()来获取等价物。

      编辑: Jon Skeet 的回复是一种更好的方法,您根本不比较名称,而是使用 Class isInstance() 方法来检查 Class 是否兼容。

      【讨论】:

      • “Jon Skeet 的回复是更好的方法……”啊,这种情况发生了多少次了……
      猜你喜欢
      • 1970-01-01
      • 2012-06-25
      • 2013-05-22
      • 2014-07-07
      • 1970-01-01
      • 1970-01-01
      • 2015-12-09
      • 2013-12-16
      • 2010-09-18
      相关资源
      最近更新 更多