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;
|
}
|
}
|