package com.zt.modules.oss.annotation; import com.zt.common.annotation.OssField; import com.zt.modules.oss.model.OssFieldDefine; import io.swagger.annotations.ApiModel; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.Resource; import org.springframework.core.io.ResourceLoader; import org.springframework.core.io.support.ResourcePatternResolver; import org.springframework.core.io.support.ResourcePatternUtils; import org.springframework.core.type.AnnotationMetadata; import org.springframework.core.type.classreading.CachingMetadataReaderFactory; import org.springframework.core.type.classreading.MetadataReader; import org.springframework.core.type.classreading.MetadataReaderFactory; import org.springframework.stereotype.Component; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; import java.util.Map; @Component("dataFieldParser") public class DataFieldParser { @Autowired private ResourceLoader resourceLoader; private static final String VALUE = "value"; /** * 获取指定包下所有添加了执行注解的方法信息 * * @return * @throws Exception */ public List getOssFields() throws Exception { List defines = new ArrayList<>(); ResourcePatternResolver resolver = ResourcePatternUtils.getResourcePatternResolver(resourceLoader); MetadataReaderFactory metaReader = new CachingMetadataReaderFactory(resourceLoader); Resource[] resources = resolver.getResources("classpath*:com/zt/**/*.class"); for (Resource r : resources) { MetadataReader reader = metaReader.getMetadataReader(r); defines.addAll(resolveClass(reader)); } return defines; } private List resolveClass(MetadataReader reader) { List defines = new ArrayList<>(); // 获取注解元数据 AnnotationMetadata metadata = reader.getAnnotationMetadata(); // 获取类中RequestMapping注解的value属性 if (!metadata.hasAnnotation(ApiModel.class.getCanonicalName())) { return defines; } String apiName = getAttr(metadata.getAnnotationAttributes(ApiModel.class.getCanonicalName()), VALUE); try { Class clazz = Class.forName(metadata.getClassName()); OssFieldDefine define = new OssFieldDefine(clazz.getSimpleName(), apiName); Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { boolean isOssField = field.isAnnotationPresent(OssField.class); if (isOssField) { OssField annotation = field.getAnnotation(OssField.class); define.addField(field.getName(), annotation.value()); } } if (define.getFields().size() > 0) { defines.add(define); } } catch (ClassNotFoundException e) { e.printStackTrace(); } return defines; } /** * 获取注解的属性 * * @param attributes * @param key * @return */ private String getAttr(Map attributes, String key) { // 若类无注解 if (attributes == null || attributes.get(key) == null) { return null; } // 获取注解的属性值 Object value = attributes.get(key); if (value instanceof String) { return (String) value; } else if (value instanceof String[]) { String[] values = (String[]) attributes.get(key); if (0 == values.length) { return null; } return values[0]; } return null; } }