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

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

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]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 为什么eprime输出的数据会有缺失?
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能
  • ¥15 jmeter脚本回放有的是对的有的是错的
  • ¥15 r语言蛋白组学相关问题