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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李小丰 黑马帝   /  2012-2-6 14:20  /  2040 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

当我们利用反射操作类里面的成员时,为什么操作实例成员还要要传递一个对象给它,而静态成员就不需要传递一个对象给它 ?

如:

public class BirdMan {
public static void cry() {
  System.out.println("I'm crying");
}
public void shout() {
  System.out.println("I'm shouting");
}
public static void main(String[] args) throws Exception {
  
  Class.forName("cn.itcast.draft.BirdMan").getMethod("cry", null).invoke(null, null) ;  //invoke方法没有传递对象
  
  BirdMan bm = new BirdMan() ;
  Class.forName("cn.itcast.draft.BirdMan").getMethod("shout", null).invoke(bm, null) ;  //invoke方法传递了对象
}
}

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1 解决了得话可以改成已解决了,初来驾到,敬.

查看全部评分

5 个回复

正序浏览
个人感觉,反射因为是通过类的字节码,得到Method类的,所以要对一个Mehthod中的invoke方法要传递对象的实例是为了,我们要对那个对象去改变它所特有的状态。而静态不是对一个实例的特有数据去改变,而是对每一个类的实例都去共享了,所以可以传递一个null对象.

评分

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

查看全部评分

回复 使用道具 举报
如果invoke(对象名,参数)传递的对象名是null,表示调用了静态成员变量。如果不是null,则调用了某一个对象实例。
如果此方法是静态成员方法,直接调用null.

评分

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

查看全部评分

回复 使用道具 举报
楼主的问题其实可以解释为,
普通成员变量做为类的属性是依附在对象身上的,由不同实例对象决定它的值,不同的对象可以自已改变而不影响其他同类型对象
而静态成员变量是类所持有的,只有一份,不依赖对象,即同类型的所以对象公共,静态成员变量的改变影响此类型的所以对象
故在反射中,反射普通成员变量要以对象为基础,反射静态成员变量不需要指实例对象

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

回复 使用道具 举报
通过查阅api可知invoke方法如果底层方法是静态的,那么可以忽略指定的 obj 参数。该参数可以为 null。如果底层方法所需的形参数为 0,则所提供的 args 数组长度可以为 0 或 null。

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

回复 使用道具 举报

利用反射得到了method,
调用此方法格式为:
method.invoke(对象名,参数):
就是说若此方法非静态,
需要被对象调用,但是被哪个对象调用了呢?
那么就应该把对象名传入才对.

如果此方法为静态方法,不用对象调用即可使用,
那么就不用传对象,直接null即可.

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

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