开发者社区> 问答> 正文

java反射调用方法报错?报错

我只是想通过反射调用普通的方法,其实就是一个很普通很简单的方法调用,但是却报错了,不知道哪里出了问题,代码如下:

public static void test(String[] args){
		for (Object str : args) {
			System.out.println(str);
		}
	}
	
	public static void invokeMethod(String classFullName,String methodName,String[] args) throws Exception{
		Class<?> c = Class.forName(classFullName);
		Object obj = c.newInstance();
		Method method = c.getMethod(methodName, args.getClass());
		if(!method.isAccessible()){
			method.setAccessible(true);
		}
		System.out.println(method);
		method.invoke(obj, args);
		
	}
	
	public static void main(String[] args) throws Exception {
		//testClass();
		//printMethods("com.wangbiao.reflection.ReflectionTest");
		String[] arguments = new String[]{"Programing Language "," is "," Java"};
		invokeMethod("com.wangbiao.reflection.ReflectionTest","test",arguments);
	}

错误如下:

Exception in thread "main" 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.wangbiao.reflection.ReflectionTest.invokeMethod(ReflectionTest.java:70)
    at com.wangbiao.reflection.ReflectionTest.main(ReflectionTest.java:78)


展开
收起
爱吃鱼的程序员 2020-06-14 18:49:12 900 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    method.invoke(obj,args);

    改成:

    method.invoke(obj,(Object)args);

    回复 @xesam:嗯,你是对的。回复 @青木河:不完全正确。“如果test是String...可变参数形式的,那么invoke方法就不用强制转换成object了”。但是,这个时候就需要手动将参数包装成一个数组了,所以,调用需要改成method.invoke(obj,newObject[]{args});回复 @王大叔爱编程:因为java编译器会把实参String[]数组(即args)解析成可变参数列表(即string,string,......),而test方法形参是String[]args,只代表一个参数,编译器不会把形参数组解析成列表。所以强制转换成Object一个实参,就好了。如果test是String...可变参数形式的,那么invoke方法就不用强制转换成object了。感谢,现在运行正常了,但是不明白的是,Method.invoke(Objectobj,Object...args)第二个参数是Object的变长数组,我放String[]按道理是没有问题的啊,为什么必须要强转才可以呢?求赐教。直接传String[]会被可变参数Object...转成Object[],在反射调用方法的时候Object[]中的内容分别表示和其索引对应的参数,所以它认为你传的是三个String类型的参数.
    2020-06-14 18:49:30
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载