| 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<OssFieldDefine> getOssFields() throws Exception { | 
|         List<OssFieldDefine> 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<OssFieldDefine> resolveClass(MetadataReader reader) { | 
|         List<OssFieldDefine> 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<String, Object> 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; | 
|     } | 
| } |