解析Java反射java.lang.IllegalArgumentException: wrong number of arguments

今天在写一个反射的例子的时候,遇到了java.lang.IllegalArgumentException: wrong number of arguments这个错误,后来看了源代码,才知道错误的原因,一个很低级的错误;

首先我的代码是这样写的:在我的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);就解决了;



  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值