巧用Reflections库实现包扫描(扫描某个包中某个接口实现、注解等)

许久不更新博客了。最近在做项目时遇到了一个需要扫描某个包中的某个接口的实现类的需求,在网上搜了一下,发现了一些还不错的实现,但是有句话说得好:“不要重复发明轮子。”像这样的需求肯定是有很多现成的解决方案的。在github和stackoverflow上找了之后发现Reflections库可以完美地实现上述需求,现分享给大家。

Reflections库的依赖:

Gradle:

[plain]  view plain  copy
  1. compile group: 'org.reflections', name: 'reflections', version: '0.9.11'  
Maven:

[html]  view plain  copy
  1. <dependency>  
  2.     <groupId>org.reflections</groupId>  
  3.     <artifactId>reflections</artifactId>  
  4.     <version>0.9.11</version>  
  5. </dependency>  

使用起来非常简单:

[java]  view plain  copy
  1. @Test  
  2. public void testReflections() {  
  3.     Reflections reflections = new Reflections("org.fhp.test.entity");  
  4.     Set<Class<? extends MyInterface>> classes = reflections.getSubTypesOf(MyInterface.class);  
  5.   
  6.     for(Class clazz : classes) {  
  7.         //logger.info(clazz.getName());  
  8.         System.out.println("Found: " + clazz.getName());  
  9.     }  
  10. }  


假如想扫描整个工程的类,直接new一个不带参数的Reflections就好。值得一提的是,这东西在扫描的时候,连依赖的jar包都不放过。以Spring框架的BeanFactory为例:

[java]  view plain  copy
  1. import org.springframework.beans.factory.BeanFactory;  
[java]  view plain  copy
  1. @Test  
  2. public void testReflections() {  
  3.     Reflections reflections = new Reflections();  
  4.     Set<Class<? extends BeanFactory>> classes = reflections.getSubTypesOf(BeanFactory.class);  
  5.   
  6.     for(Class clazz : classes) {  
  7.         //logger.info(clazz.getName());  
  8.         System.out.println("Found: " + clazz.getName());  
  9.     }  
  10. }  


另一个常用的场景是扫描包含指定注解的类。reflections对象中同样包含这一方法,代码如下:

[java]  view plain  copy
  1. import org.springframework.stereotype.Service;  

[java]  view plain  copy
  1. @Test  
  2. public void testReflections() {  
  3.     Reflections reflections = new Reflections();  
  4.     Set<Class<?>> classes = reflections.getTypesAnnotatedWith(Service.class);  
  5.   
  6.     for(Class clazz : classes) {  
  7.         //logger.info(clazz.getName());  
  8.         System.out.println("Found: " + clazz.getName());  
  9.     }  
  10. }  

Reflections还有很多类似的反射类操作(如扫描方法、扫描参数等),可以说是应有尽有了。有兴趣的小伙伴们可以参考Reflection库的源码或者官方文档,这里就不详述了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值