解析Java反射java.lang.IllegalArgumentException: wrong number of arguments
2015-08-22 21:07
609 查看
今天在写一个反射的例子的时候,遇到了java.lang.IllegalArgumentException: wrong number of arguments这个错误,后来看了源代码,才知道错误的原因,一个很低级的错误;
首先我的代码是这样写的:在我的jpa栏中注解的那块代码中:
这种情况也报错
java.lang.IllegalArgumentException: wrong number of arguments
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.rong.zhu.jpa.ParseAnnotaion.parse(ParseAnnotaion.java:42)
at com.rong.zhu.jpa.MainTest.main(MainTest.java:17)
原因是:
由于print(String str[])方法只有一个String数组的参数所以这是编译器会把字符串数组当作一个可变长度参数传给对象str,而我们取得方法只有一个参数,所以就会出现wrong number of arguments的异常,我们只要把字符串数组强制转换为一个Object对象就可以解决这个异常了,m.invoke(obj,(Object)name);就解决了;
首先我的代码是这样写的:在我的jpa栏中注解的那块代码中:
<span style="font-family:SimSun;font-size:18px;"> 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(); } } } }</span>首先我把
<span style="font-family:SimSun;font-size:18px;">m.invoke(obj,(Object)chineseName,(Object)EnlishName);</span>写成了 new Oject[]{chineseName,(Object)EnlishName},报这个错,然后我发现我解析的这个方法中是2个参数,我这样写,其实是传一个数组参数的,所以不对应;后来我就改成了
<span style="font-family:SimSun;font-size:18px;">m.invoke(obj,chineseName,EnlishName);</span>还有就是:
<span style="font-family:SimSun;font-size:18px;">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"}); } }</span>
<span style="font-family:SimSun;font-size:18px;"> public String print(String[] str) { System.out.println(str[0]+","+str[1]); return str[0]+","+str[1]; }</span>
<span style="font-family:SimSun;font-size:18px;">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(); } } } }</span>
这种情况也报错
java.lang.IllegalArgumentException: wrong number of arguments
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.rong.zhu.jpa.ParseAnnotaion.parse(ParseAnnotaion.java:42)
at com.rong.zhu.jpa.MainTest.main(MainTest.java:17)
原因是:
由于print(String str[])方法只有一个String数组的参数所以这是编译器会把字符串数组当作一个可变长度参数传给对象str,而我们取得方法只有一个参数,所以就会出现wrong number of arguments的异常,我们只要把字符串数组强制转换为一个Object对象就可以解决这个异常了,m.invoke(obj,(Object)name);就解决了;
相关文章推荐
- Java 实现PAT乙级(Basic Level)1001-1010 解题报告(一)
- Java中的正则表达式
- Java中的正则表达式
- 使用Eclipse查看java源码
- java中string与json互相转化
- java file 删除目录下无用的文件
- spring 注解
- Exception in thread " " java.lang.UnsupportedClassVersionError: 错误
- Eclipse创建Struts项目
- Java------类加载机制
- Java- 对象清楚与垃圾回收
- Java Map接口Properties
- Java生成CSV文件
- Java字符串操作、基本运算方法等优化策略
- Java 注解的简单学习与应用 Annotation
- Java Map接口TreeMap
- eclipse最有用快捷键整理
- Spring-管理bean
- Java学习笔记,基础总结(一)
- Java集合Set、List、Map的遍历方法