如何通过反射获取子父类中所有字段及其属性?

摘要:需求:有一个vo类,该类继承了一个实体类,获取到vo对象后,需要将其中的null值转为空字符串; 思路:传入参数,用Object接收,利用反射获取到该对象的所有字段,并判断置空; 由于一开始没有考虑到父类的字段获取,导致时不时出现错误,因此
需求:有一个vo类,该类继承了一个实体类,获取到vo对象后,需要将其中的null值转为空字符串; 思路:传入参数,用Object接收,利用反射获取到该对象的所有字段,并判断置空; 由于一开始没有考虑到父类的字段获取,导致时不时出现错误,因此这里简单记录一下。 // 无需返回object,set后对象内的值就已经修改了 public static void setNullToEmpty(Object object){ Class<?> clazz = object.getClass(); Field[] fields = getAllFields(clazz); for (Field field : fields) { // 这里只处理类型为string的 if (field.getType().equals(String.class)) { // get和set前都需要赋予访问权限 field.setAccessible(true); if (field.get(object) == null) { DataUtil.setValue(object, field); } } } } /** * 设置新值 * * */ public static void setValue(Object object, Field field) { try{ Class<?> clazz = object.getClass(); field.setAccessible(true); // 当前对象是否属于子类 if (field.getDeclaringClass() == clazz) { field.set(object, "newValue"); } else { Field parentField = clazz.getSuperclass().getDeclaredField(field.getName()); parentField.setAccessible(true); parentField.set(object, "newValue"); } }catch (Exception e){ e.printStackTrace(); } } /** * 获取当前类及其父类的所有字段信息 * @param clazz * @return */ public static Field[] getAllFields(Class<?> clazz) { Field[] allFields = clazz.getDeclaredFields(); // 获取当前类的所有字段 Class<?> superClass = clazz.getSuperclass(); // 若存在父类 则获取父类信息 if (superClass != null) { allFields = concatenate(getAllFields(superClass), allFields); } return allFields; } /** * 合并子类 + 父类 * @param parent * @param child * @return */ public static Field[] concatenate(Field[] parent, Field[] child) { int parentLen = parent.length; int childLen = child.length; Field[] c= new Field[parentLen+childLen]; System.arraycopy(parent, 0, c, 0, parentLen); System.arraycopy(child, 0, c, parentLen, childLen); return c; }