Java反射:类的数组与参数类型的数组

时间:2009-06-02 22:15:45

标签: java reflection

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

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

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

3 个答案:

答案 0 :(得分:7)

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
  }
}

(当然,做任何你需要做的有效/无效案件。)

答案 1 :(得分:1)

不是检查方法的参数是否与您的Object数组兼容,为什么不让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);

这不适合你吗?

答案 2 :(得分:0)

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

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

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

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

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