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}