JavaVirgin
2009-11-30 17:52
浏览 202
已采纳

反射机制中方法的参数是基本类型的疑惑

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]

谁能解释一下

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

3条回答 默认 最新

  • rednaxelafx 2009-12-01 02:43
    已采纳

    如果你用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]

    点赞 打赏 评论
  • wanghaolovezlq 2009-11-30 17:57

    这是人家jvm内部机制来兼容这种基本类型,
    这也是原本java早期设计的不好,说面向对象,但却搞出基本类型,不完全都是对象

    点赞 打赏 评论
  • lijiepeng 2009-12-01 08:14

    楼上正解.
    自动拆装箱有好处,但除了滥用对性能的影响外,还会造成理解上的问题...

    点赞 打赏 评论

相关推荐 更多相似问题