今天在写一个反射的例子的时候,遇到了java.lang.IllegalArgumentException: wrong number of arguments这个错误,后来看了源代码,才知道错误的原因,一个很低级的错误;
首先我的代码是这样写的:在我的jpa栏中注解的那块代码中:
public void parse(Object obj, String methodName,String chineseName,String EnlishName) {
Method[] ms = obj.getClass().getMethods();
for (Method m : ms) {
if (methodName.equals(m.getName())) {
HelloWorld hw = m.getAnnotation(HelloWorld.class);
try{
m.invoke(obj,(Object)chineseName,(Object)EnlishName);
}catch(Exception e){
e.printStackTrace();
}
}
}
}
首先我把
m.invoke(obj,(Object)chineseName,(Object)EnlishName);
写成了 new Oject[]{chineseName,(Object)EnlishName},报这个错,然后我发现我解析的这个方法中是2个参数,我这样写,其实是传一个数组参数的,所以不对应;后来我就改成了
m.invoke(obj,chineseName,EnlishName);
还有就是:
public class MainTest {
public static void main(String[] args) {
TestCase tc = new TestCase("王五","wangwu");
ParseAnnotaion parseAnno = new ParseAnnotaion();
// System.out.print("方法 print():");
// System.out.println(" ------------------------------");
// parseAnno.parse(tc, "print", "zhangsan", "lisi");
// System.out.print("\n"+"方法 toString():");
// System.out.println(" --------------------------------");
// parseAnno.parse(tc, "toString", "", "");
parseAnno.parse(tc, "print", new String[]{"1","2"});
}
}
public String print(String[] str) {
System.out.println(str[0]+","+str[1]);
return str[0]+","+str[1];
}
public void parse(Object obj, String methodName,String[] name) {
Method[] ms = obj.getClass().getMethods();
for (Method m : ms) {
if (m.isAnnotationPresent(HelloWorld.class)
&& methodName.equals(m.getName())) {
HelloWorld hw = m.getAnnotation(HelloWorld.class);
System.out.println("hw.chineseName:"+hw.chineseName());
System.out.println("hw.value:"+hw.enlishName());
try{
System.out.println("before invoke");
m.invoke(obj,name);
System.out.println("after invoke");
}catch(Exception e){
e.printStackTrace();
}
}
}
}
原因是:
由于print(String str[])方法只有一个String数组的参数所以这是编译器会把字符串数组当作一个可变长度参数传给对象str,而我们取得方法只有一个参数,所以就会出现wrong number of arguments的异常,我们只要把字符串数组强制转换为一个Object对象就可以解决这个异常了,m.invoke(obj,(Object)name);就解决了;