我有一个类Method的对象。我调用了m.getParameterTypes()
来创建方法参数的数组参数。
我还有一个Object的数组arr。我想检查arr中的对象是否与params中的类型相同(并且顺序相同)。
我所做的是创建一个数组类,其中包含arr中每个对象的类。然后我尝试将类与params进行比较。事实证明它们永远不会相等,因为classes数组中的类格式为java.lang.String
,而param数组中的参数格式为String
。我如何比较阵列?如何更改其中一个的格式?
答案 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()方法来检查类是否兼容。