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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

在刚学习和使用反射的时候,常用到的几个方法老是傻傻的分不清楚是干吗的,功能差不多的啊,
比如:
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){ /*一些实现代码*/}
答案是:
  1.         public static void setProperty(Object object,String propertyName,Object value) throws Exception
  2.         {
  3.                 Class<?> c=object.getClass();
  4.                 Field f=c.getDeclaredField(propertyName);//取得这个类自己定义的所有公开的私有的字段,但是不包括继承的字段
  5.                 f.setAccessible(true);
  6.                 f.set(object,value);       
  7.         }
  8. //在这里我们用getDeclaredField()方法在这个类自己定义的所有字段,但是不包括继承的字段中查找名字为形参"propertyName"的字段,然后给这个字段重新赋值.
复制代码






4 个回复

倒序浏览
学习了,楼主总结的很好!
回复 使用道具 举报
其实可以从用户的角度来理解.
我们用户想从Class对象来了解其数据域的话, 想了解哪些信息呢?
无非两种:
一种是: 其对外的接口, 即public性质的数据成员---其自身的, 以及其父类祖先类的 public性质的数据成员.
一种是: 在其自身声明的那些数据成员---无论是public还是priavte等等性质的数据成员, 都包括在内.
所以, 就出现两种方法了:
getField对应第一种情况;
getDeclaredField对应第二种情况.
另外, 这个东西, 从Declared单词我们就可以了解到, 其意思是说, 在这个类定义中声明的东西, 即无论是public/private等, 都算是在其内部声明的东西啊.
回复 使用道具 举报
反射还正在学习呢,不知道这个入学考试的时候会不会考,希望考到了也是个简单的
回复 使用道具 举报
liu951753xz 发表于 2014-9-24 14:49
反射还正在学习呢,不知道这个入学考试的时候会不会考,希望考到了也是个简单的 ...

放心吧,百分百考,综合应用,所以你还是好好看看吧.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马