Java反射框架reflections
前言
最近做项目的时候,需要实现一个需求客户要求获取每个接口的具体访问信息,导出到Excel,需要获取到swagger中注解的信息,刚开始想了两种实现方式,一种是请求swagger接口获取信息,另一种是通过反射直接获取,最后采用了反射,在网上浏览资料时发现了这个框架,比较简洁。
依赖
1
2
3
4
5
|
<dependency>
<groupId>org.reflections</groupId>
<artifactId>reflections</artifactId>
<version>0.9.11</version>
</dependency>
|
代码实例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
/**
* @Author: Mr_J
* @Date: 2021/10/29 6:47 下午
*/
@Component
@Slf4j
public class InterfaceStatisticsInitListener implements ApplicationListener<ContextRefreshedEvent> {
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
log.info("读取接口层信息开始");
//构建 反射条件 根据需要添加
Reflections reflections = new Reflections(
new ConfigurationBuilder().
//指定路径
setUrls(ClasspathHelper.forPackage("com.jsh.reflections.controller"))
.setScanners(
//添加方法参数扫描
new MethodParameterScanner()
//添加属性注解扫描
,new FieldAnnotationsScanner()
//添加子类扫描
,new SubTypesScanner()
//添加注解扫描
,new TypeAnnotationsScanner()
//添加方法注解扫描
,new MethodAnnotationsScanner())
);
//根据注解获取类
Set<Class<?>> classes = reflections.getTypesAnnotatedWith(Api.class);
classes.forEach(clazz -> {
//处理单个类 //反射
Method[] methods = clazz.getMethods();
for (Method method : methods) {
ApiOperation annotation = method.getAnnotation(ApiOperation.class);
//输出类上注解信息
if (annotation == null) {
continue;
}
System.out.println(annotation.value());
String name = method.getName();
//输出方法名
System.out.println(name);
}
});
// 反射出子类
Set<Class<? extends TestController>> set = reflections.getSubTypesOf( TestController.class ) ;
// 获取带有特定注解对应的方法
Set<Method> methods = reflections.getMethodsAnnotatedWith( ApiOperation.class ) ;
System.out.println("m"+methods);
// 获取带有特定注解对应的字段
Set<Field> fields = reflections.getFieldsAnnotatedWith( Autowired.class ) ;
System.out.println("f"+fields);
// 获取特定参数对应的方法
Set<Method> someMethods = reflections.getMethodsMatchParams(long.class, int.class);
System.out.println("s"+someMethods);
// 获取特定返回值的方法
Set<Method> voidMethods = reflections.getMethodsReturn(void.class);
System.out.println("v"+voidMethods);
//获取参数带有某个注解的方法
Set<Method> pathParamMethods =reflections.getMethodsWithAnyParamAnnotated(RequestParam.class);
System.out.println("p"+pathParamMethods);
}
}
|