反射框架Reflections
reflections
一、简介
Reflections通过扫描classpath,索引元数据,并且允许在运行时查询这些元数据。
使用Reflections可以很轻松的获取以下元数据信息:
- 获取某个类型的全部子类
- 只要类型、构造器、方法,字段上带有特定注解,便能获取带有这个注解的全部信息(类型、构造器、方法,字段)
- 获取所有能匹配某个正则表达式的资源
- 获取所有带有特定签名的方法,包括参数,参数注解,返回类型
- 获取所有方法的名字
- 获取代码里所有字段、方法名、构造器的使用权
二、Maven依赖
xml
1<dependency>
2 <groupId>org.reflections</groupId>
3 <artifactId>reflections</artifactId>
4 <version>0.9.11</version>
5</dependency>三、使用方法
3.1 实例化
指定要扫描的包名
java
1// 实例化Reflections,并指定要扫描的包名
2Reflections reflections = new Reflections("my.project");
3// 获取某个类的所有子类
4Set<Class<? extends SomeType>> subTypes = reflections.getSubTypesOf(SomeType.class);
5// 获取包含某个注解的所有类
6Set<Class<?>> annotated = reflections.getTypesAnnotatedWith(SomeAnnotation.class);
7指定要扫描的包名并添加过滤器
java
1Reflections reflections = new Reflections(
2 new ConfigurationBuilder()
3 .forPackage("com.my.project")
4 .filterInputsBy(new FilterBuilder().includePackage("com.my.project")));添加扫描器
java
1// scan package with specific scanners
2Reflections reflections = new Reflections(
3 new ConfigurationBuilder()
4 .forPackage("com.my.project")
5 .filterInputsBy(new FilterBuilder().includePackage("com.my.project").excludePackage("com.my.project.exclude"))
6 .setScanners(TypesAnnotated, MethodsAnnotated, MethodsReturn));
7
8// scan package with all standard scanners
9Reflections reflections = new Reflections("com.my.project", Scanners.values());3.2 扫描子类
java
1Set<Class<? extends Module>> modules =
2 reflections.getSubTypesOf(com.google.inject.Module.class);3.3 扫描注解
java
1//TypeAnnotationsScanner
2Set<Class<?>> singletons =
3 reflections.getTypesAnnotatedWith(javax.inject.Singleton.class);3.4 扫描资源
java
1//ResourcesScanner
2Set<String> properties =
3 reflections.getResources(Pattern.compile(".*.properties"));3.5 扫描方法、构造注解
java
1//MethodAnnotationsScanner
2Set<Method> resources =
3 reflections.getMethodsAnnotatedWith(javax.ws.rs.Path.class);
4Set<Constructor> injectables =
5 reflections.getConstructorsAnnotatedWith(javax.inject.Inject.class);3.6 扫描字段注解
java
1Set<Field> ids =
2 reflections.getFieldsAnnotatedWith(javax.persistence.Id.class);3.7 扫描方法参数
java
1//MethodParameterScanner
2Set<Method> someMethods =
3 reflections.getMethodsMatchParams(long.class, int.class);
4Set<Method> voidMethods =
5 reflections.getMethodsReturn(void.class);
6Set<Method> pathParamMethods =
7 reflections.getMethodsWithAnyParamAnnotated(PathParam.class);3.8 扫描方法参数名
java
1List<String> parameterNames =
2 reflections.getMethodParamNames(Method.class)3.9 扫描方法调用情况
java
1//MemberUsageScanner
2Set<Member> usages =
3 reflections.getMethodUsages(Method.class)