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 getFields(Class<T> clazz) {
021        ClassFields classFields = new ClassFields();
022
023        // 获取接口类或父类继承的字段
024        Field[] fields = clazz.getFields();
025        if (ObjectUtil.isNotNull(fields)) {
026            List<ClassFieldInfo> lstClassFieldInfo = getFieldsAndSwaggerModelPropertyValue(fields, true);
027            if (CollectionUtil.isNotEmpty(lstClassFieldInfo)) {
028                classFields.setLstParentField(lstClassFieldInfo);
029            }
030        }
031
032        // 获取本类的字段
033        Field[] declaredFields = clazz.getDeclaredFields();
034        if (ObjectUtil.isNotNull(declaredFields)) {
035            List<ClassFieldInfo> lstClassFieldInfo = getFieldsAndSwaggerModelPropertyValue(declaredFields, false);
036            if (CollectionUtil.isNotEmpty(lstClassFieldInfo)) {
037                classFields.setLstDeclaredField(lstClassFieldInfo);
038            }
039        }
040
041        return classFields;
042    }
043
044    private static List<ClassFieldInfo> getFieldsAndSwaggerModelPropertyValue(Field[] fields, Boolean isParent) {
045        if (ObjectUtil.isNull(isParent)) {
046            isParent = false;
047        }
048
049        List<ClassFieldInfo> lstClassFieldInfo = new ArrayList<>();
050        if (ObjectUtil.isNotNull(fields)) {
051            for (Field field : fields) {
052                field.setAccessible(true);
053
054                ClassFieldInfo classFieldInfo = new ClassFieldInfo();
055                classFieldInfo.setName(field.getName());
056                classFieldInfo.setType(field.getType().getName());
057                classFieldInfo.setDesc(getFieldSwaggerModelPropertyValue(field));
058                classFieldInfo.setIsParent(isParent);
059
060                lstClassFieldInfo.add(classFieldInfo);
061            }
062        }
063
064        return lstClassFieldInfo;
065    }
066
067    /**
068     * 获取字段Swagger属性描述
069     * @param field
070     * @param <T>
071     * @return
072     */
073    private static <T> String getFieldSwaggerModelPropertyValue(Field field) {
074        ApiModelProperty annotation = field.getDeclaredAnnotation(ApiModelProperty.class);
075        if (ObjectUtil.isNotNull(annotation)) {
076            return annotation.value();
077        }
078
079        return null;
080    }
081}