ToB企服应用市场:ToB评测及商务社交产业平台

标题: 反射——子父类字段获取 [打印本页]

作者: 科技颠覆者    时间: 2023-11-27 05:55
标题: 反射——子父类字段获取
需求:有一个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. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4