001package top.cenze.utils;
002
003import cn.hutool.core.collection.CollectionUtil;
004import cn.hutool.core.util.ObjectUtil;
005import io.swagger.annotations.ApiModelProperty;
006import top.cenze.utils.pojo.ClassFieldInfo;
007import top.cenze.utils.pojo.ClassFields;
008
009import java.lang.reflect.Field;
010import java.util.ArrayList;
011import java.util.List;
012
013/**
014 * @desc: 反射工具类
015 * @author: chengze
016 * @createByDate: 2023/10/30 9:32
017 */
018public class ReflectionUtil {
019
020    public static <T> ClassFields getAllFields(Class<T> clazz) {
021        return getFields(clazz, null);
022    }
023
024    public static <T> ClassFields getExistApiModelPropertyFields(Class<T> clazz) {
025        return getFields(clazz, true);
026    }
027
028    public static <T> ClassFields getNotExistApiModelPropertyFields(Class<T> clazz) {
029        return getFields(clazz, false);
030    }
031
032    /**
033     *
034     * @param clazz
035     * @param existApiModelProperty  true只返回带ApiModelProperty注解的字段,false只返回不带ApiModelProperty注解的字段, null返回所有字段
036     * @param <T>
037     * @return
038     */
039    public static <T> ClassFields getFields(Class<T> clazz, Boolean existApiModelProperty) {
040        ClassFields classFields = new ClassFields();
041
042        // 获取接口类或父类继承的字段
043        Field[] fields = clazz.getFields();
044        if (ObjectUtil.isNotNull(fields)) {
045            List<ClassFieldInfo> lstClassFieldInfo = getFieldsAndSwaggerModelPropertyValue(fields, true, existApiModelProperty);
046            if (CollectionUtil.isNotEmpty(lstClassFieldInfo)) {
047                classFields.setLstParentField(lstClassFieldInfo);
048            }
049        }
050
051        // 获取本类的字段
052        Field[] declaredFields = clazz.getDeclaredFields();
053        if (ObjectUtil.isNotNull(declaredFields)) {
054            List<ClassFieldInfo> lstClassFieldInfo = getFieldsAndSwaggerModelPropertyValue(declaredFields, false, existApiModelProperty);
055            if (CollectionUtil.isNotEmpty(lstClassFieldInfo)) {
056                classFields.setLstDeclaredField(lstClassFieldInfo);
057            }
058        }
059
060        return classFields;
061    }
062
063    private static List<ClassFieldInfo> getFieldsAndSwaggerModelPropertyValue(Field[] fields, Boolean isParent, Boolean existApiModelProperty) {
064        if (ObjectUtil.isNull(isParent)) {
065            isParent = false;
066        }
067
068        List<ClassFieldInfo> lstClassFieldInfo = new ArrayList<>();
069        if (ObjectUtil.isNotNull(fields)) {
070            for (Field field : fields) {
071                field.setAccessible(true);
072                ApiModelProperty annotation = field.getDeclaredAnnotation(ApiModelProperty.class);
073
074                ClassFieldInfo classFieldInfo = new ClassFieldInfo();
075                classFieldInfo.setField(field.getName());
076                classFieldInfo.setType(field.getType().getName());
077                classFieldInfo.setName(getFieldSwaggerModelPropertyValue(annotation));
078                classFieldInfo.setRequired(getFieldSwaggerModelPropertyRequired(annotation));
079                classFieldInfo.setIsParent(isParent);
080                if (!existApiModelProperty && ObjectUtil.isNull(annotation)) {
081                    lstClassFieldInfo.add(classFieldInfo);
082                } else if (existApiModelProperty && ObjectUtil.isNotNull(annotation)) {
083                    lstClassFieldInfo.add(classFieldInfo);
084                } else {
085                    lstClassFieldInfo.add(classFieldInfo);
086                }
087            }
088        }
089
090        return lstClassFieldInfo;
091    }
092
093    /**
094     * 获取字段Swagger属性描述
095     * @param annotation
096     * @return
097     */
098    private static String getFieldSwaggerModelPropertyValue(ApiModelProperty annotation) {
099        if (ObjectUtil.isNotNull(annotation)) {
100            return annotation.value();
101        }
102
103        return null;
104    }
105
106    /**
107     * 获取字段Swagger属性描述
108     * @param annotation
109     * @return
110     */
111    private static boolean getFieldSwaggerModelPropertyRequired(ApiModelProperty annotation) {
112        if (ObjectUtil.isNotNull(annotation)) {
113            return annotation.required();
114        }
115
116        return false;
117    }
118
119    /**
120     * 获取字段Swagger属性描述
121     * @param field
122     * @return
123     */
124    private static String getFieldSwaggerModelPropertyValue(Field field) {
125        ApiModelProperty annotation = field.getDeclaredAnnotation(ApiModelProperty.class);
126        if (ObjectUtil.isNotNull(annotation)) {
127            return annotation.value();
128        }
129
130        return null;
131    }
132
133
134}