wrong number of arguments,java方法反射时数组参数的坑

java方法中只有一个参数是数组,反射的时候我们不能想当然的传歌数组进去,传数组进去的时候表示多个参数。
两个数组不是一个意思啊。

我们应该把数组转为objet,这样才表示一个参数。

import java.lang.reflect.Method;

public class MethodTest {
	public void a(String[] args) {
		System.out.println("a");
	}

	public static void main(String[] args) throws Exception {
		MethodTest obj = new MethodTest();
		Method m = obj.getClass().getMethod("a", String[].class);

		m.invoke(obj, new String[1]);  // new String[1] 其实是null,是一个object
		m.invoke(obj, (Object) new String[] {}); // 这里强制转成了object,所以也是object
		m.invoke(obj, new String[] {}); // 报错,这里是个数组,是个object数组,a方法只有一个参数,所以报错

	}
}

结果是

a

a

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:57)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:606)

原文链接:http://huangyunbin.iteye.com/blog/2179144

时间: 2024-10-06 22:01:33

wrong number of arguments,java方法反射时数组参数的坑的相关文章

关于java方法中Object... args参数的含义

关于java方法中Object... args参数的含义 在阅读google发布的volley源码时,突然看到一个方法中存在这样的写法,如 :v(String format, Object... args) 不明白什么意思,琢磨着为什么要这样写呢,跟Object[] args是一个意思吗?为什么用三个点代替呢?后来查阅了下文档,原来这是JDK1.5新增语法,新特性,动态参数或者是可变参数的意思. 举例: 有个方法v,调用v方法 v(里面写多少参数都行); 比如: v(1,"s"); v

”Java 方法可以返回数组类型“ 所想到的

在C和C++中不能返回一个局部变量,因为函数中的局部变量分配的存储空间在栈上,当函数执行完后会被重新利用,所以想要返回数组类型,有两种方式:1)静态变量(static in a function可以在函数调用之间保持值有效),2)利用malloc动态分配,但是最终要记得释放.下面是几个简单测试程序: 1.错误的示例: #include <stdio.h> int *func(int n){ int x = n *n; int a[] = {1,3,4,5,7}; a[0] = x; retur

Effective Java - 方法的参数声明

给方法的参数加上限制是很常见的,比如参数代表索引时不能为负数.对于某个关键对象引用不能为null,否则会进行一些处理,比如抛出相应的异常信息. 对于这些参数限制,方法的提供者必须在文档中注明,并且在方法开头时检查参数,并在失败时提供明确的信息,即: detect errors as soon as possible after they occur 这将成为准确定位错误的一大保障. 如果没有做到这一点,最好的情况是方法在处理过程中失败并抛出了莫名其妙的异常,错误的源头变得难以定位,但这是最好的情

Java中反射代码实例

我们建立一个Person类,对此进行反射操作. package myReflection; public class Person { private String name; private String id; Person(){} /** * @param name * @param id */ public Person(String name, String id) { super(); this.name = name; this.id = id; } /** * @return t

Java方法中传值和引用传递的问题(转)

说明:标题其实说法是错误的.Java中只有值传递,没有引用传递. ... ... //定义了一个改变参数值的函数 public static void changeValue(int x) { x = x *2; } ... ... //调用该函数 int num = 5; System.out.println(num); changeValue(num); System.out.println(num); ... ... 调用函数changeValue()前后num的值都没有改变. 值传递的过

java方法参数传递方式只有----值传递!

在通常的说法中,方法参数的传递分为两种,值传递和引用传递,值传递是指将实际参数复制一份传递到方法中, 在方法中的改动将不会影响到实际参数本身,而引用传递则是指传递的是实际参数本身,在方法中的改动将会影响到实 际参数本身.但是,在java中只有值传递,没有引用传递!那么,为什么当方法参数是基本数据类型时表现是值传递, 而当是引用类型时表现的是引用传递形式呢? Java内存区域中含有java堆和虚拟机栈两个内存区域(并不是只是将java内存区分为这两个内存区域,此外还有程 序计数器,本地方法栈以及方

对Java方法、方法重载的理解

一.方法 1.什么是方法方法就是一个代码片段,在其他地方被引用,类似于C语言当中的"函数".2.方法的命名规则必须以字母.下划线或'$'符号开头:可以包括数字,但不能以他开头.3.方法的基本语法 // 方法定义 public static 方法返回值 方法名称([参数类型 形参 ...]){ 方法体代码; [return 返回值]; } // 方法调用 返回值变量 = 方法名称(实参...); 注意:方法定义时的参数称为 "形参", 方法调用时的参数称为 "

【Java】变长参数的坑

VarArgs VarArgs简述 只需要明确一点即可,java方法的变长参数只是语法糖,其本质上还是将变长的实际参数 varargs 包装为一个数组. 所以 Object[] objs 与 Object... objs 被看作是相同的签名,在源码级别是不能同时存在的,因此,无法编译通过 VarArgs包装 包装方式(注意,下面的代码不是实际的实现,而是一个比喻说明): 如果实参是唯一且匹配形参varargs要求的数组(就是实参独占形参varargs),那么可以认为你已经替编译器干了这个活,所以

swift向方法传数组参数的语法

总是记不住向方法中传数组参数的语法,所以记录一下. func calculateStatistics(scores:[Int]) -> (min:Int,max:Int,sum:Int) { var min = scores[0] var max = scores[0] var sum = 0 for score in scores { if score>max { max=score } else if score<min{ min=score } sum += score } ret