黑马程序员技术交流社区

标题: Field 的反射问题 [打印本页]

作者: 兜兜转转    时间: 2013-9-2 10:18
标题: Field 的反射问题
本帖最后由 杨增坤 于 2013-9-3 11:01 编辑

问题:得到的Field对象是对应到类上面的成员变量,还是对应到对象上的成员变量?类只有一个,而该类的实例对象有多个,如果是与对象关联,哪关联的是哪个对象呢?所以字段fieldX 代表的是x的定义,而不是具体的x变量?

以上张孝祥老师PPT里面的原话,这个是什么意思?

作者: 薛淑凯    时间: 2013-9-2 10:49
是类上的变量吧,应该在调用方法的时候进行关联的,比如Object get(Object obj)   传入一个关联对象
作者: 兜兜转转    时间: 2013-9-2 11:06
薛淑凯 发表于 2013-9-2 10:49
是类上的变量吧,应该在调用方法的时候进行关联的,比如Object get(Object obj)   传入一个关联对象 ...

类加载的时候,如果没创建对象,这些变量就不在内存的啊,创建对象之后,对象在堆内存中存在,然后非静态的成员变量才会存在于堆中某个对象里。
作者: 静以修身    时间: 2013-9-2 11:42
本帖最后由 静以修身 于 2013-9-2 11:48 编辑

得到的对象是类的组成部分,Filed类型的对象。首先通过反射获得类的Class对象,然后获得反射类的各个组成部分(你这里的是反射类的属性)。
clazz.getField("name");   //只能获取本类中公有的
clazz.getDeclaredFiled("name")  //获取本类,但包含私有
如果是与对象关联,具体关联哪个对象是由你自己指定的,该对象提供了两个方法get()和set()用于获取和设置由你指定的对象。性对于提前硬编码目标类来说大大提高了获取类对象的灵活性字段FieldX代表的是X的定义是指一个类的定义,即反射类的一个组成成分(也是一个类)的定义。而不是具体的X的变量是指不是具体类对象的X变量,比如有个对象Person p = null;该类有个变量X,你获取的X变量不是具体对象p的变量

作者: 我,邓伟    时间: 2013-9-2 12:31
兜兜转转 发表于 2013-9-2 11:06
类加载的时候,如果没创建对象,这些变量就不在内存的啊,创建对象之后,对象在堆内存中存在,然后非静态 ...

我是这么认为的。字节码文件,就是经过java编译器,编译过的一种文件,说白了就是二进制文件,只有在运行的时候才加载进内存,进而各种东西进堆内存,进栈内存,进方法区,那么可以想象通过,字节码.getFieled("X").获取自身的字段属性,跟它是否只能创建对象无关,因为是通过字节码直接调用本身的二进制文件查找字段的。不知道对不对啊,其实要是学会了底层调用,多看看虚拟机原理,应该还是很简单的问题。

作者: 兜兜转转    时间: 2013-9-2 13:05
静以修身 发表于 2013-9-2 11:42
得到的对象是类的组成部分,Filed类型的对象。首先通过反射获得类的Class对象,然后获得反射类的各个组成部 ...

那到底是属于谁的呢?
是独立?
还是类的?
你已经说了不是对象的了。

作者: 静以修身    时间: 2013-9-2 16:27
兜兜转转 发表于 2013-9-2 13:05
那到底是属于谁的呢?
是独立?
还是类的?

是类的,有一句话是这样说的:JAVA反射机制是在运行状态中,对于任意一个类(class文件),都能够知道这个类的所有属性和方法。
希望能对你有用!

作者: 杨增坤    时间: 2013-9-2 19:00
你上面的字段fieldX 代表的是Class类中的成员属性字段,他现在和任何对象都无关系,在后面才建立连接。
public static void main(String[] agrs) throws Exception {
                Class c = Person.class;
                Field f = c.getDeclaredField("name");// 这个此时只是一个字段,他和任何Perspn对象都无关,在下面才和Person对象建立关系
                Person r = new Person();
                f.setAccessible(true);
                f.set(r, "张三");//字段和Person对象建立关系
                System.out.println(f.get(r));//这里也是建立了关系
        }
希望这些对你有帮助!






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2