一. Reflections简介

jdk的反射api很难用

比如:要取出一个类的所有返回string,不带参数的,且以to开头的public方法

代码如下

ArrayList results = new ArrayList();

for (Method m : String.class.getDeclaredMethods()) {

if (Modifier.isPublic(m.getModifiers()) &&

m.getReturnType().equals(String.class) &&

m.getParameterCount() == 0 &&

m.getName().startsWith("to")) {

results.add(m);

}

}

Reflections库可以简化这个过程,同样的查询如下

Set results = getMethods(String.class,

withModifier(Modifier.PUBLIC),

withReturnType(String.class),

withParametersCount(0),

withPrefix("to"));

Reflections浏览classpath,索引metadata,能够运行时查询如下类型的元数据

子类型

注解的类型,与参数匹配的类型

匹配正则的

特定签名的方法

典型应用如下

Reflections reflections = new Reflections("my.project");

Set> subTypes = reflections.getSubTypesOf(SomeType.class);

Set> annotated = reflections.getTypesAnnotatedWith(SomeAnnotation.class);

二. 用法

使用默认的scanners,浏览url包含my.package的路径,包括以my.package开头的

Reflections reflections = new Reflections("my.package");

使用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"))

...);

然后方便的使用查询方法,这要根据具体scanners配置

SubTypesScanner

Set> modules =

reflections.getSubTypesOf(com.google.inject.Module.class);

TypeAnnotationsScanner

Set> singletons =

reflections.getTypesAnnotatedWith(javax.inject.Singleton.class);

ResourcesScanner

Set properties =

reflections.getResources(Pattern.compile(".*\\.properties"));

MethodAnnotationsScanner

Set resources =

reflections.getMethodsAnnotatedWith(javax.ws.rs.Path.class);

Set injectables =

reflections.getConstructorsAnnotatedWith(javax.inject.Inject.class);

FieldAnnotationsScanner

Set ids =

reflections.getFieldsAnnotatedWith(javax.persistence.Id.class);

MethodParameterScanner

Set someMethods =

reflections.getMethodsMatchParams(long.class, int.class);

Set voidMethods =

reflections.getMethodsReturn(void.class);

Set pathParamMethods =

reflections.getMethodsWithAnyParamAnnotated(PathParam.class);

MethodParameterNamesScanner

List parameterNames =

reflections.getMethodParamNames(Method.class)

MemberUsageScanner

Set usages =

reflections.getMethodUsages(Method.class)

如果没有配置scanner,默认使用SubTypesScanner和TypeAnnotationsScanner

也可以配置Classloader,用来解析某些实时类

保证能够解析到url

git上的例子:https://github.com/ronmamo/reflections/tree/master/src/test/java/org/reflections

三. ReflectionUtils

ReflectionsUtils包含了一些方便的方法,形式类似*getAllXXX(type, withYYY)

比如

import static org.reflections.ReflectionUtils.*;

Set getters = getAllMethods(someClass,

withModifier(Modifier.PUBLIC), withPrefix("get"), withParametersCount(0));

//or

Set listMethodsFromCollectionToBoolean =

getAllMethods(List.class,

withParametersAssignableTo(Collection.class), withReturnType(boolean.class));

Set fields = getAllFields(SomeClass.class, withAnnotation(annotation), withTypeAssignableTo(type));

四. ClasspathHelper

获取包、class、classloader的方法

使用maven可以很方便的集成到项目中,可以把浏览的元数据存储到xml/json文件中,下一次不必浏览,直接使用

在maven中,使用Reflections Maven plugin插件

其他用法

并行查找url

序列化查找为xml/json

直接利用存储的元数据,快速load,不必再次scan

存储模型实体为.java文件,可以通过静态方式引用types/fields/methods/annotation

初始化srping的包浏览

五. 注解的例子

获取包中,带TaskOption注解的类,然后获取注解的task()

Map, Class>> optionMap = new HashMap<>();

for (Class> clazz : reflections.getTypesAnnotatedWith(TaskOption.class)) {

TaskOption taskOption = clazz.getAnnotation(TaskOption.class);

if (taskOption == null) continue; // this shouldn't happen

optionMap.put(taskOption.task(), clazz);

}

java reflections_java-工具-Reflections相关推荐

  1. java reflections_关于java:java反射工具Reflections用法

    java反射工具Reflections用法 一.引入maven依赖 org.reflections reflections 0.9.10 二.用法示例: reflections 中蕴含很多的Scann ...

  2. java reflections_java反射工具Reflections用法

    java反射工具Reflections用法 一.引入maven依赖 org.reflections reflections 0.9.10 二.用法示例: reflections 中包含很多的Scann ...

  3. java reflections_Java反射框架Reflections示例详解

    MAVEN 坐标 org.reflections reflections 0.9.10 Reflections 的作用 Reflections通过扫描classpath,索引元数据,并且允许在运行时查 ...

  4. Java开发工具简介

    Java语言是一种解释性的语言,即读一句程序执行一句,这样就需要一 个解释器完成源程序到机器语言的翻译过程.同时Java是跨平台的语 言,跨平台是指Java程序可以在安装任何操作系统的计算机上运行,起 ...

  5. java+构建+工具+Ant+Maven+Gradle

    java+构建+工具+Ant+Maven+Gradle Ant+Maven+Gradle+............ 目前: Ant已经销声匿迹.Maven也没落了,而Gradle的发展则如日中天. M ...

  6. java myeclipse 下载_myeclipse 10|MyEclipse(优秀的Java开发工具myeclipse下载) 10.7官方版下载 - 下载吧...

    MyEclipse10官方下载是一款非常优秀的Java开发工具.MyEclipse的功能非常强大,支持也十分广泛,尤其是对各种开源产品的支持十分不错.MyEclipse目前支持Java Servlet ...

  7. jar java classpath_win7中java编程工具安装 java环境变量设置

    win7中java编程工具安装 java环境变量设置 Question:编译是显示'javac'不是内部或外部命令,也不是可运行的程序或批处理文件 解决: 在[系统变量]里编辑java_home.cl ...

  8. java 开发工具_Java开发工具和环境,你了解多少?

    Java作为今年来最热门的编程语言之一,越来越多的人选择Java,但对于一些初入门的小白来说,在选择和安装开发工具和环境的时候,会遇见很多的问题. 今天就给大家来分享一些实用的Java开发工具和环境, ...

  9. UrlUtils工具类,Java URL工具类,Java URL链接工具类

    UrlUtils工具类,Java URL工具类,Java URL链接工具类 >>>>>>>>>>>>>>>&g ...

  10. 主流Java报表工具的比较

    从部署.展示.设计等方面,全面比较Java报表工具,如 润乾 , 杰表 ,Style Report,Jasper等,以及声称支持Java的Crystal Report,数巨等. Java报表工具,首先 ...

最新文章

  1. Silverlight实例_人立方
  2. CSP:CSP认证考试:202104-1(灰度直方图)满分答案,Java版
  3. 在eclipse导入SSH项目
  4. Cisco二层交换机命令
  5. 通过一个例子介绍 IDA pro 的简单使用
  6. openssl 生成证书_CentOS7 httpd(Apache)SSL 证书部署
  7. python中注释的作用_Python函数添加注释的好处
  8. ZOJ 2527题解
  9. vue分享卡住_vue init webpack卡住无反应??
  10. openGL超级宝典第七版
  11. PyCharm入门使用教程-最强版本
  12. 停下来想一想:你为什么会离开游戏行业?
  13. 使用spring validation完成数据后端校验-自定义校验的注解-判断是否为空
  14. 地铁综合监控系统网络方案,简化工作轻松应对客流高峰
  15. 四旋翼无人机动力学模型及控制
  16. ppt怎么把图片做成翻书效果_ppt怎么做出翻页效果图文教程
  17. String中的assign函数
  18. Python爬虫 | 利用python爬虫获取想要搜索的数据
  19. 基于matlab的蝗虫优化(Grasshopper Optimization Algorithm,GOA)算法仿真
  20. 数据库原理实验 三个关系表 学生表students 课程表course 学生选课表sc

热门文章

  1. django的CBV与FBV介绍
  2. Ubuntu——基于Wine安装微信、QQ、腾讯会议
  3. 【游戏开发实战】Unity 2D游戏物理运动曲线轨迹预测,以愤怒的小鸟为例,轨迹曲线云团圈圈
  4. 游戏中的技能如何而来? 为ARPG设计一个好用的BUFF系统
  5. 无线网络受限制或无连接
  6. 计算机学院春节祝福词,【CES·新年】计算机学院给您送祝福啦!
  7. MySQL数据库配置文件介绍及使用
  8. [buuoj]极客大挑战 2019]PHP 1
  9. 测试用例设计之正交法
  10. mysql修改排序规则