黑马程序员技术交流社区
标题:
反射的问题???
[打印本页]
作者:
李小丰
时间:
2012-2-6 14:20
标题:
反射的问题???
当我们利用反射操作类里面的成员时,为什么操作实例成员还要要传递一个对象给它,而静态成员就不需要传递一个对象给它 ?
如:
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方法传递了对象
}
}
作者:
李泽霖
时间:
2012-2-6 15:28
通过查阅api可知invoke方法如果底层方法是静态的,那么可以忽略指定的 obj 参数。该参数可以为 null。如果底层方法所需的形参数为 0,则所提供的 args 数组长度可以为 0 或 null。
作者:
王文龙
时间:
2012-2-6 15:42
利用反射得到了method,
调用此方法格式为:
method.invoke(对象名,参数):
就是说若此方法非静态,
需要被对象调用,但是被哪个对象调用了呢?
那么就应该把对象名传入才对.
如果此方法为静态方法,不用对象调用即可使用,
那么就不用传对象,直接null即可.
作者:
梅雄新
时间:
2012-2-6 16:07
楼主的问题其实可以解释为,
普通成员变量做为类的属性是依附在对象身上的,由不同实例对象决定它的值,不同的对象可以自已改变而不影响其他同类型对象
而静态成员变量是类所持有的,只有一份,不依赖对象,即同类型的所以对象公共,静态成员变量的改变影响此类型的所以对象
故在反射中,反射普通成员变量要以对象为基础,反射静态成员变量不需要指实例对象
作者:
maochong
时间:
2012-2-7 17:37
如果invoke(对象名,参数)传递的对象名是null,表示调用了静态成员变量。如果不是null,则调用了某一个对象实例。
如果此方法是静态成员方法,直接调用null.
作者:
【专】【属】
时间:
2012-2-7 19:55
个人感觉,反射因为是通过类的字节码,得到Method类的,所以要对一个Mehthod中的invoke方法要传递对象的实例是为了,我们要对那个对象去改变它所特有的状态。而静态不是对一个实例的特有数据去改变,而是对每一个类的实例都去共享了,所以可以传递一个null对象.
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2