A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 赵亚威 中级黑马   /  2013-4-5 11:27  /  1192 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 赵亚威 于 2013-4-5 12:59 编辑

class ReflectTest{
        public static void main(String[] args)throws Exception{
        String str= "itcastheima.com" ;
                str.charAt(0);   
                Method method=String.class.getMethod("charAt", int.class);
     System.out.println(method.invoke(str,new Object[]{1} ));//为什么不直接赋予一个整数呢?
     //这不很麻烦嘛

}
}

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

2 个回复

倒序浏览
                可以啊
回复 使用道具 举报
本帖最后由 刘焕新 于 2013-4-5 12:31 编辑

这个很好理解啊!首先你要注意的是Object和Object[]的区别,前者是个对象,后者是个数组,数组可包含N个对象。
将invoke方法的参数定义为Object[]就是为了增强它的通用性,因为invoke()实际可以调用的方法千千万,它们参数个数是不一定的。
所以API约定,你要用Method的invoke方法,传入参数就必须是Object[]数组类型。这样,invoke方法内部会将Object[]数组转换为实际调用方法所需的参数类型。

当你传入的参数是基本数据类型时,JVM会自动将基本数据类型封装成其包装类的对象,即:自动装箱。所以,此时参数变成了一个Object对象。
然后这个Object对象被传进去之后,invoke方法不知道、也不会管你传入的参数实际是什么类型,仍然把参数当做Object[]数组类型去使用,后果自然就很可能会出错啦。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马