Java 参数数目错误调用方法时出错
我有classJava 参数数目错误调用方法时出错,java,reflection,illegalargumentexception,Java,Reflection,Illegalargumentexception,我有classAClass和一个方法someMethod,该方法获取一个对象数组作为参数 public class AClass { public void someMethod(Object[] parameters) { } } 大体上,当我尝试在已创建的对象上调用此方法并将对象数组作为此方法的参数时 Object[] parameters; // lets say this object array is null Class class = Class.forName(
AClass
和一个方法someMethod
,该方法获取一个对象
数组作为参数
public class AClass {
public void someMethod(Object[] parameters) {
}
}
大体上,当我尝试在已创建的对象上调用此方法并将对象数组作为此方法的参数时
Object[] parameters; // lets say this object array is null
Class class = Class.forName("AClass");
Object anObject = class.newInstance();
Method someMethod = class.getDeclaredMethod("someMethod", parameters.getClass());
someMethod.invoke(anObject, parameters);
我得到了“错误数量的参数错误”。
我错过了什么 调用
的参数是对象的数组
;您的参数应该是一个对象[]
,其中包含要传递给someMethod
的对象[]
您不需要创建立即数组来执行此操作,因为invoke
签名是invoke(Object,Object…
),但在您的情况下,您尝试传入一个空数组。如果要传入null:
Object[] parameters = { null };
...
someMethod.invoke(anObject, parameters);
但最终,其他答案是正确的:您需要传入一个对象[]
,其中包含每个方法参数的条目。方法。invoke
方法使用对象接收方法调用和方法参数数组。由于您的方法只接受一个参数,因此给定的数组大小必须为1
尝试创建大小为1
的新数组:
someMethod.invoke(anObject, new Object[] {parameters});
请注意,此数组中的一个值可以是
null
。这将模拟一个对象。someMethod(null),这样就可以了
Object[] parameters = {new Object()}; // lets say this object array is null
Class clas = Class.forName("AClass");
Object anObject = clas.newInstance();
Object[] param = {parameters};
Method someMethod = clas.getDeclaredMethod("someMethod", parameters.getClass());
someMethod.invoke(anObject, param);
请注意invoke方法的第二个参数。它是
Object[]
本身,并且您的方法的参数类型也是Object[]
。来扩展一下orien和biaobiaoqi所说的内容
这里可能让您感到困惑的是,Method.invoke(Object,Object…);当编译器看到类似于someMethod.invoke(someObject,arg1,arg2)
的内容时,它会隐式创建一个数组新对象[]{arg1,arg2}
,然后将该数组传递给Method.invoke
Method.invoke
然后将该数组的元素作为参数传递给正在调用的方法。到目前为止,一切顺利
但是当编译器看到类似于someMethod.invoke(someObject,someArray)
的内容时,它会假定您已经将参数打包到数组中;这样就不会再重新包装了。因此,Method.invoke
将尝试将someArray
的元素作为参数传递给正在调用的方法,而不是将someArray
本身作为参数传递
(这始终是…
符号的工作方式;它接受包含适当类型元素的数组,或者接受零个或多个适当类型的参数。)
因此,正如orien和Biaobioqi所说,您需要将参数
重新包装到一个额外的数组中,新对象[]{parameters}
,这样参数
本身就被传递到您的方法中
这有意义吗?试试这个:
someMethod.invoke(anObject, new .java.lang.Object[1][]{parameters});
我通过使用dp4j自动生成代码的反射API版本获得:
$ javac -cp dp4j-1.2-jar-with-dependencies.jar -Averbose=true AClass.java
AClass.java:10: Note:
import com.dp4j.*;
public class AClass {
public AClass() {
super();
}
public void someMethod(Object[] parameters) {
}
@Reflect(all = true)
public static void main(String... args) throws ... {
Object[] parameters = null;
...
AClass anObject;
anObject = (.AClass)aClassConstructor.newInstance();
java.lang.reflect.Method someMethodWithArrayMethod = null;
someMethodWithArrayMethod = Class.forName("AClass").getDeclaredMethod("someMethod", .java.lang.Object[].class);
someMethodWithArrayMethod.setAccessible(true);
someMethodWithArrayMethod.invoke(anObject, new .java.lang.Object[1][]{parameters});
}
}
我猜这不是你真正的代码。因为它会抛出nullpointerException,这可能会导致混淆;什么是P
?您正在传入一个对象[]
包含一个对象[]
包含一个对象的对象
,它没有空值。它是有效的,但我不明白为什么我们必须写这行:Object[]param={parameters};因为someMethod的签名是method.invoke(objectobj,Object…args)。事实上,someMethod只有一个参数是Object[],所以应该传递参数[Object[]]最好的解释谢谢。