黑马程序员技术交流社区
标题:
反射学习之getField()与getDeclaredField()的区别
[打印本页]
作者:
liaorubei
时间:
2014-9-24 14:27
标题:
反射学习之getField()与getDeclaredField()的区别
在刚学习和使用反射的时候,常用到的几个方法老是傻傻的分不清楚是干吗的,功能差不多的啊,
比如:
Class.getFields(), Class.getField(String), Class.getDeclaredFields(), Class.getDeclaredField(String)
和
Class.getMethods(), Class.getMethod(String, Class[]), Class.getDeclaredMethods(), Class.getDeclaredMethod(String, Class[])
主要的就是有没有Declared单词的区别,
今天又用到了getDeclaredField()方法了,于是就不再瞎想区别是什么了,认认真真的看了一遍有和没有Declared单词的区别.
得到了结果是,上面的几个方法中,
如果有Declared单词的,获取的是类中自己定义的,包括公开的,不公开的所有成员,
如果没有这个单词,那么获取的是那个类中拥有的所有公开的成员,包括自己定义的和继承下来的成员.
重点的区别是一个是自己定义的,一个是自己拥有的.分清楚之后用起来就有一种天下反射唯我独尊的感觉,连放屁都好像比往常顺畅了.
-------------------------------------------------------------------------------------------------------------------------------------------
下面附送一个测试题和答案,
需求是:
写一个方法,此方法可将obj对象中名为propertyName的属性的值设置为value.
public void setProperty(Object obj, String propertyName, Object value){ /*一些实现代码*/}
答案是:
public static void setProperty(Object object,String propertyName,Object value) throws Exception
{
Class<?> c=object.getClass();
Field f=c.getDeclaredField(propertyName);//取得这个类自己定义的所有公开的私有的字段,但是不包括继承的字段
f.setAccessible(true);
f.set(object,value);
}
//在这里我们用getDeclaredField()方法在这个类自己定义的所有字段,但是不包括继承的字段中查找名字为形参"propertyName"的字段,然后给这个字段重新赋值.
复制代码
作者:
daoqin
时间:
2014-9-24 14:32
学习了,楼主总结的很好!
作者:
zuochbd
时间:
2014-9-24 14:42
其实可以从用户的角度来理解.
我们用户想从Class对象来了解其数据域的话, 想了解哪些信息呢?
无非两种:
一种是: 其对外的接口, 即public性质的数据成员---其自身的, 以及其父类祖先类的 public性质的数据成员.
一种是: 在其自身声明的那些数据成员---无论是public还是priavte等等性质的数据成员, 都包括在内.
所以, 就出现两种方法了:
getField对应第一种情况;
getDeclaredField对应第二种情况.
另外, 这个东西, 从Declared单词我们就可以了解到, 其意思是说, 在这个类定义中声明的东西, 即无论是public/private等, 都算是在其内部声明的东西啊.
作者:
liu951753xz
时间:
2014-9-24 14:49
反射还正在学习呢,不知道这个入学考试的时候会不会考,希望考到了也是个简单的
作者:
liaorubei
时间:
2014-9-24 15:00
liu951753xz 发表于 2014-9-24 14:49
反射还正在学习呢,不知道这个入学考试的时候会不会考,希望考到了也是个简单的 ...
放心吧,百分百考,综合应用,所以你还是好好看看吧.
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2