在刚学习和使用反射的时候,常用到的几个方法老是傻傻的分不清楚是干吗的,功能差不多的啊,
比如:
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"的字段,然后给这个字段重新赋值.
复制代码
|
|