我正在编写一个例程来调用方法,这些方法由一个名称和一组参数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);
}
答案 0 :(得分:5)
数组是对象,而不是基元。在对象上使用==
仅比较它们是否都指向相同的引用,而您实际上想要分别比较每个单独的数组项。
您希望使用Arrays#equals()
。
if (Arrays.equals(methodParams, searchParams)) {
// ...
}
答案 1 :(得分:1)
你的第一个方法实际上并不比较数组元素,而是比较数组引用,它们将不相同。如果您认为第二段代码很难看,您可能需要查看Arrays.equals(Object[] a, Object[] a2),它实际上会以成对的方式比较两个数组(正是您在第二种情况下所做的)。