反射 设置实体字段的默认属性

830 阅读1分钟

一、通过反射,获取实体基本数据类型字段,并给其设置默认值

一般数据库有设置默认值的话 可以通过数据来处理, 如果数据库没有默认值的话 这需要手动设置,如果一个一个字段来写则很浪费时间,可以通过如下方式来实现

主要分为三步来处理,

  1. 通过反射获取实体的所有字段
    private static final Map<Class<?>, List<Field>> FIELD_CACHES = new HashMap<>(100);
    /**
     * 获取所有字段
     *
     * @param clazz 反射对象
     * @return 对象字段 带缓存
     */
    public static List<Field> getDeclaredFields(Class<?> clazz) {
        Assert.notNull(clazz, "Class must not be null");
        List<Field> list = FIELD_CACHES.get(clazz);
        if (list == null) {
            try {
                Field[] currentFields = clazz.getDeclaredFields();
                list = new ArrayList<>(Arrays.asList(currentFields));
                Class<?> superClass = clazz.getSuperclass();
                if (superClass != null) {
                    Field[] superFields = superClass.getDeclaredFields();
                    list.addAll(new ArrayList<>(Arrays.asList(superFields)));
                }
                FIELD_CACHES.put(clazz, list);
            } catch (Throwable var3) {
                throw new IllegalStateException(
                    "Failed to introspect Class [" + clazz.getName() + "] from ClassLoader ["
                        + clazz.getClassLoader() + "]", var3);
            }
        }
        return list;
    }
  1. 获取所有的字段和期对应的属性
    /**
     * 获取属性 和值
     *
     * @param obj 反射对象
     * @return 属性和值 MAP
     */
    public static Map<String, AliasValue> getPropertyAndValue(Object obj) {
        Class<?> tClass = obj.getClass();
        List<Field> fields = getDeclaredFields(tClass);
        Map<String, AliasValue> map = new HashMap<>(fields.size());
        String alias = "";
        if (tClass.isAnnotationPresent(TableAlias.class)) {
            TableAlias tableAlias = tClass.getAnnotation(TableAlias.class);
            alias = tableAlias.value();
        }
        for (Field field : fields) {
            // 排除serialVersionUID
            if (Modifier.isStatic(field.getModifiers())) {
                continue;
            }
            try {
                field.setAccessible(true);
                // 抛弃null
                Object value = field.get(obj);
                if (value == null) {
                    continue;
                }
                map.put(field.getName(), new AliasValue(value, alias));
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        return map;
    }
  1. 根据属性值设置期默认值
    /**
     * 设置对象属性默认值
     *
     * @param clazz clazz
     * @param obj obj
     */
    public static void setDefaultFiledValue(Class<?> clazz, Object obj) {
        if (obj == null) {
            throw new BaseException(BaseCodeEnum.DATA_NOT_EXISTS);
        }
        //获取所有属性
        List<Field> fields = getDeclaredFields(clazz);
        //获取属性值
        Map<String, AliasValue> valueMap = getPropertyAndValue(obj);

        for (Field field : fields) {
            if (valueMap.get(field.getName()) == null) {
                try {
                    field.setAccessible(true);
                    if (String.class.equals(field.getType())) {
                        field.set(obj, DefaultConstant.STRING);
                        continue;
                    }
                    if (BigDecimal.class.equals(field.getType())) {
                        field.set(obj, DefaultConstant.BIG_DECIMAL);
                        continue;
                    }
                    if (Integer.class.equals(field.getType())) {
                        field.set(obj, DefaultConstant.INTEGER);
                        continue;
                    }
                    if (Long.class.equals(field.getType())) {
                        field.set(obj, DefaultConstant.LONG);
                        continue;
                    }
                    if (LocalDateTime.class.equals(field.getType())) {
                        field.set(obj, DefaultConstant.DATE_TIME);
                        continue;
                    }
                    if (LocalDate.class.equals(field.getType())) {
                        field.set(obj, DefaultConstant.DATE);
                    }
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        }
    }