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}