利用反射读取Object中每个字段的值

forking003 2010-01-23
测试"更新"操作时用到:
Field[] fields = KnowledgePoint.class.getDeclaredFields();// 比较所有字段更新是否与期望一致
for (int i = 0; i < fields.length; i++) {
fields[i].setAccessible(true);//允许访问private修饰符字段
if (Date.class.equals(fields[i].getType())) {//日期格式不同,需要转成字符串比较,根据Type判断是否java.util.Date类型
Assert.assertEquals(DateUtils.getDateTime(DateUtils
.getDateTimePattern(), (Date) fields[i].get(kp1)),
DateUtils.getDateTime(DateUtils.getDateTimePattern(),
(Date) fields[i].get(actualKp1)));
} else {
Assert.assertEquals(fields[i].get(kp1), fields[i]
.get(actualKp1));
}
}
几个关键点:
1.Object.class.getDeclaredFields(),获取所有属性数组(Field[]),包括静态,私有属性;
2.field.setAccessible(true);没有这句就会报IllegalAccessException异常;
3.field.get(Object),获取Object的某个属性的值,比如field是password,那么返回就是密码的值;
dieslrae 2010-01-25
其实我一般不直接获取字段的值,而是调用其get方法,这样就不会破坏其封装性
forking003 2010-01-25
呵呵,楼上的兄弟误会了,这个只在单元测试用到,并非给业务代码的,主要是节省一点测试代码,毕竟一个对象几十个字段,测试更新操作时,每个字段都要测到,所以才想了这个办法.
Global site tag (gtag.js) - Google Analytics