java doc里面是这样的:
public native Object invoke(Object obj,
Object args[]) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException
但是明显int,long等基本类型不属于Object,为什么一样能用呢?
比如:
A有一个方法foo(int i);
[code="java"]
A a=new A();
int param=5;
Class[] argsClass=new Class[]{int.class};
Method method = a.getClass().getMethod("foo", argsClass);
method.invoke(a,param);
[/code]
谁能解释一下
如果你用Java 5之前的版本,例如用了很久的1.4.2来试试,就会看到你的实例代码通不过编译了。原因是从Java 5开始,Java语言引入了自动装箱与自动拆箱的特性。自动装箱就是由Java编译器自动生成从原始类型到对应的包装类型的转换的代码,自动拆箱则是其反过程。所以从Java 5开始,Integer i = 1;与int i = Integer.valueOf(1);都可以编译通过,实际上Java编译器生成的代码分别对应:Integer i = Integer.valueOf(1);与int i = Integer.valueOf(1).intValue();。这个特性不需要JVM的特别支持,只需要Java编译器来实现。
从Java 5开始,Method.invoke()的signature应该是这样的:
[code="java"]public Object invoke(Object obj,
Object... args)
throws IllegalAccessException,
IllegalArgumentException,
InvocationTargetException[/code]
注意到args参数前的“...”。这表明该参数是可变长度参数,可以接受任意个参数,由Java编译器生成代码将这些参数用数组打包起来再实际传给方法。
在上述两个语言特性的支持下,楼主的代码才得以正确编译。
关于Method.invoke(),有兴趣的话可以看看这篇:[url]http://rednaxelafx.iteye.com/blog/478564[/url]
这是人家jvm内部机制来兼容这种基本类型,
这也是原本java早期设计的不好,说面向对象,但却搞出基本类型,不完全都是对象
楼上正解.
自动拆装箱有好处,但除了滥用对性能的影响外,还会造成理解上的问题...