原创:Java反射中java.lang.IllegalArgumentException: wrong number of arguments异常

        时光如梭,转眼间到了2011年,新的一年,新的开始,希望同学们在这一年里有更大的收获. 我们开始了今年的第一个班级授课任务

,这几天都忙于给学员加强java基础.

    在忙于授课的同时,把今天学员遇到的第一个关于反射的bug:java.lang.IllegalArgumentException: wrong number of

arguments的问题解析如下:

  1. arguments的问题解析如下:   
  2.   
  3. 1、错误bug   
  4. java.lang.IllegalArgumentException: wrong number of arguments   
  5.     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)   
  6.     at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)   
  7.     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)   
  8.     at java.lang.reflect.Constructor.newInstance(Constructor.java:513)   
  9.     at cn.csdn.reflect.StudentTest.test4(StudentTest.java:84)   
  10.     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)   
  11.     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)   
  12.     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)   
  13.     at java.lang.reflect.Method.invoke(Method.java:597)   
  14.     at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)   
  15.     at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)   
  16.     at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)   
  17.     at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)   
  18.     at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)   
  19.     at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)   
  20.     at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:73)   
  21.     at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:46)   
  22.     at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:180)   
  23.     at org.junit.runners.ParentRunner.access$000(ParentRunner.java:41)   
  24.     at org.junit.runners.ParentRunner$1.evaluate(ParentRunner.java:173)   
  25.     at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)   
  26.     at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)   
  27.     at org.junit.runners.ParentRunner.run(ParentRunner.java:220)   
  28.     at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46)   
  29.     at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)   
  30.     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)   
  31.     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)   
  32.     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)   
  33.     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)   
  34.   
  35. 异常引起的原因分析:   
  36.   
  37. 引起错误的原码:   
  38. public Student(String strs[]){   
  39.         System.out.println(strs.length);   
  40.     }   
  41.   
  42. 执行代码:   
  43.    //解析:public cn.csdn.reflect.Student(java.lang.String[])   
  44.     @Test  
  45.     public void test4()throws Exception{   
  46.         //1、加载类   
  47.         Class cls = Class.forName("cn.csdn.reflect.Student");   
  48.         //2、根据构造器参数类型获取相应的构造器对象       
  49.         Constructor csr = cls.getConstructor(String[].class);   
  50.         //3、创建实体对象   
  51.         Student entity = (Student)csr.newInstance(new String[]{});   
  52.         //4、调用方法   
  53.         entity.study();   
  54.     }   
  55. 编译环境:jdk1.6  
  56.   
  57. 错误分析:由于Student(String strs[])构造器只有一个String数组的参数所以这是编译器会把字符串数组当作一个可变长度参数传 给对象strs,而我们取得方法只有一个参数,所以就会出现wrong number of arguments的异常,我们只要把字符串数组强制转换为一  个Object对象就可以解决这个异常了,   
  58.   
  59. 解决方案:   
  60.   //解析:public cn.csdn.reflect.Student(java.lang.String[])   
  61.     @Test  
  62.     public void test4()throws Exception{   
  63.         //1、加载类   
  64.         Class cls = Class.forName("cn.csdn.reflect.Student");   
  65.         //2、根据构造器参数类型获取相应的构造器对象       
  66.         Constructor csr = cls.getConstructor(String[].class);   
  67.            
  68.         String str[]={"111","123"};   
  69.         //3、创建实体对象   
  70.         Student entity = (Student)csr.newInstance((Object)str);   
  71.         //4、调用方法   
  72.         entity.study();   
  73.     }  

 以上内容归redarmy_chen原创,版权归redarmy_chen所有不得随意转载 如有问题请发送邮件到redarmy_chen@qq.com

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值