匹配类数组

时间:2010-05-27 18:26:47

标签: java arrays reflection equals

我正在编写一个例程来调用方法,这些方法由一个名称和一组参数Class值

找到

通过getName匹配方法,但是当尝试匹配参数的给定Class []和Method.getParameterTypes()时,我遇到了麻烦。

我认为这样可行:


Class[] searchParams = new Class[] { float.class, String.class };
Class[] methodParams = m.getParameterTypes();

if(methodParams == searchParams) { m.invoke(this, paramValues); }

但显然不是 - 永远不会到达m.invoke。我已经检查过了,methodParams提供了与searchParams相同的类。

下面的代码可行,并选择正确的方法,但它似乎是一种非常肮脏的做事方式,我敢肯定我错过了一些明显的东西。


Class[] searchParams = new Class[] { float.class, String.class };
Class[] methodParams = m.getParameterTypes();

boolean isMatch = true; for(int i = 0; i < searchParams.length; i++) { if(!searchParams.getClass().equals(methodParams.getClass())) { isMatch = false; } }

if(isMatch) { m.invoke(this, paramValues); }

2 个答案:

答案 0 :(得分:5)

数组是对象,而不是基元。在对象上使用==仅比较它们是否都指向相同的引用,而您实际上想要分别比较每个单独的数组项。

您希望使用Arrays#equals()

if (Arrays.equals(methodParams, searchParams)) {
    // ...
}

答案 1 :(得分:1)

你的第一个方法实际上并不比较数组元素,而是比较数组引用,它们将不相同。如果您认为第二段代码很难看,您可能需要查看Arrays.equals(Object[] a, Object[] a2),它实际上会以成对的方式比较两个数组(正是您在第二种情况下所做的)。