Java 运行时元数据分析:Reflections

jopen 9年前

Reflections 通过扫描 classpath,索引元数据,允许在运行时查询这些元数据,也可以保存收集项目中多个模块的元数据信息。


使用 Reflections 可以查询以下元数据信息: 
1)获得某个类型的所有子类型
2)获得标记了某个注解的所有类型/成员变量,支持注解参数匹配。
3)使用正则表达式获得所有匹配的资源文件
4)获得所有特定签名(包括参数,参数注解,返回值)的方法

Reflections 依赖 Google 的 Guava 库和 Javassist 库。

Maven 项目导入

<dependency>      <groupId>org.reflections</groupId>      <artifactId>reflections</artifactId>      <version>0.9.10</version>  </dependency>

通常用法:

Reflections reflections = new Reflections("my.project");    Set<Class<? extends SomeType>> subTypes = reflections.getSubTypesOf(SomeType.class);    Set<Class<?>> annotated = reflections.getTypesAnnotatedWith(SomeAnnotation.class);


Reflections 初始化代码。

//scan urls that contain 'my.package', include inputs starting with 'my.package', use the default scanners  Reflections reflections = new Reflections("my.package");    //or using ConfigurationBuilder  new Reflections(new ConfigurationBuilder()       .setUrls(ClasspathHelper.forPackage("my.project.prefix"))       .setScanners(new SubTypesScanner(),                     new TypeAnnotationsScanner().filterResultsBy(optionalFilter), ...),       .filterInputsBy(new FilterBuilder().includePackage("my.project.prefix"))       ...);

以下是一些使用例子代码。

//SubTypesScanner  Set<Class<? extends Module>> modules =       reflections.getSubTypesOf(com.google.inject.Module.class);
//TypeAnnotationsScanner   Set<Class<?>> singletons =       reflections.getTypesAnnotatedWith(javax.inject.Singleton.class);
//ResourcesScanner  Set<String> properties =       reflections.getResources(Pattern.compile(".*\\.properties"));
//MethodAnnotationsScanner  Set<Method> resources =      reflections.getMethodsAnnotatedWith(javax.ws.rs.Path.class);  Set<Constructor> injectables =       reflections.getConstructorsAnnotatedWith(javax.inject.Inject.class);
//FieldAnnotationsScanner  Set<Field> ids =       reflections.getFieldsAnnotatedWith(javax.persistence.Id.class);
//MethodParameterScanner  Set<Method> someMethods =      reflections.getMethodsMatchParams(long.class, int.class);  Set<Method> voidMethods =      reflections.getMethodsReturn(void.class);  Set<Method> pathParamMethods =      reflections.getMethodsWithAnyParamAnnotated(PathParam.class);
//MethodParameterNamesScanner  List<String> parameterNames =       reflections.getMethodParamNames(Method.class)
//MemberUsageScanner  Set<Member> usages =       reflections.getMethodUsages(Method.class)
 

项目主页:http://www.open-open.com/lib/view/home/1440247401583