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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© code_geass 中级黑马   /  2013-9-11 18:17  /  2100 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

1,是特有的方法才对Object[ ]的对象进行拆包吗?
2,比如用反射调用main方法。invoke方法会先判断是不是数组。然后判断内部元素是不是Object,然后决定是否拆包是吗?

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1

查看全部评分

2 个回复

正序浏览
楼上写的很具体了,简单点说就是Object【】中需要的是非基础类型的元素 是就拆不是就不拆。其实就是这个道理:基础元素类型如:int 只能作为元素存在而不能作为对象,所以可以拆
回复 使用道具 举报
本帖最后由 静以修身 于 2013-9-11 18:55 编辑

1,要查API文档看看该方法的参数决定;
2,之所以对Object[]拆包,因为该方法接受的参数是对象数组Object[]的元素,要判断是不是Object类型的数组,而不仅仅是数组,如果是基本类型的数组是不会拆包的,而会把它当成一个Object对象;invoke方法会先判断是不是数组。然后判断内部元素是不是Object,然后决定是否拆包是对的。

invoke()方法的定义:
public Object invoke(Object obj,
                     Object... args)   //这里接受的是Objec[]t的元素
              throws IllegalAccessException,
                     IllegalArgumentException,
                     InvocationTargetException对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。个别参数被自动解包,以便与基本形参相匹配,基本参数和引用参数都随需服从方法调用转换。
如果底层方法是静态的,那么可以忽略指定的 obj 参数。该参数可以为 null。

如果底层方法所需的形参数为 0,则所提供的 args 数组长度可以为 0 或 null。

如果底层方法是实例方法,则使用动态方法查找来调用它,这一点记录在 Java Language Specification, Second Edition 的第 15.12.4.4 节中;在发生基于目标对象的运行时类型的重写时更应该这样做。

如果底层方法是静态的,并且尚未初始化声明此方法的类,则会将其初始化。

如果方法正常完成,则将该方法返回的值返回给调用者;如果该值为基本类型,则首先适当地将其包装在对象中。但是,如果该值的类型为一组基本类型,则数组元素不 被包装在对象中;换句话说,将返回基本类型的数组。如果底层方法返回类型为 void,则该调用返回 null。

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1

查看全部评分

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