反射——子父类字段获取

打印 上一主题 下一主题

主题 924|帖子 924|积分 2772

需求:有一个vo类,该类继承了一个实体类,获取到vo对象后,需要将其中的null值转为空字符串;
思路:传入参数,用Object接收,利用反射获取到该对象的所有字段,并判断置空;
由于一开始没有考虑到父类的字段获取,导致时不时出现错误,因此这里简单记录一下。
  1. // 无需返回object,set后对象内的值就已经修改了
  2. public static void setNullToEmpty(Object object){
  3.     Class<?> clazz = object.getClass();
  4.     Field[] fields = getAllFields(clazz);
  5.     for (Field field : fields) {
  6.         // 这里只处理类型为string的
  7.         if (field.getType().equals(String.class)) {
  8.             // get和set前都需要赋予访问权限
  9.             field.setAccessible(true);
  10.             if (field.get(object) == null) {
  11.                 DataUtil.setValue(object, field);
  12.             }
  13.         }
  14.     }
  15. }
  16. /**
  17. * 设置新值
  18. *
  19. *
  20. */
  21. public static void setValue(Object object, Field field) {
  22.     try{
  23.         Class<?> clazz = object.getClass();
  24.         field.setAccessible(true);
  25.         // 当前对象是否属于子类
  26.         if (field.getDeclaringClass() == clazz) {
  27.             field.set(object, "newValue");
  28.         } else {
  29.             Field parentField = clazz.getSuperclass().getDeclaredField(field.getName());
  30.             parentField.setAccessible(true);
  31.             parentField.set(object, "newValue");
  32.         }
  33.     }catch (Exception e){
  34.         e.printStackTrace();
  35.     }
  36. }
  37. /**
  38. * 获取当前类及其父类的所有字段信息
  39. * @param clazz
  40. * @return
  41. */
  42. public static Field[] getAllFields(Class<?> clazz) {
  43.     Field[] allFields = clazz.getDeclaredFields(); // 获取当前类的所有字段
  44.     Class<?> superClass = clazz.getSuperclass();
  45.     // 若存在父类 则获取父类信息
  46.     if (superClass != null) {
  47.         allFields = concatenate(getAllFields(superClass), allFields);
  48.     }
  49.     return allFields;
  50. }
  51. /**
  52. * 合并子类 + 父类
  53. * @param parent
  54. * @param child
  55. * @return
  56. */
  57. public static Field[] concatenate(Field[] parent, Field[] child) {
  58.     int parentLen = parent.length;
  59.     int childLen = child.length;
  60.     Field[] c= new Field[parentLen+childLen];
  61.     System.arraycopy(parent, 0, c, 0, parentLen);
  62.     System.arraycopy(child, 0, c, parentLen, childLen);
  63.     return c;
  64. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

科技颠覆者

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表