1. 使用场景

Reflections扫描classpath, 缓存metadata, 以备运行期间使用.

  • 可获取某类的所有子类
  • 可获取某注解标注的所有类或字段
  • 可获取某正则匹配的资源
  • 可获取特定签名的方法
  1. 优点

    具备Java原生反射技术, 所不具有的功能, 反射扫描.

  2. 缺点

    底层实现, 会遍历classpath, 以及遍历jar包中的类, 太耗时间.

    只能在启动时, 做些初始化的功能.

2. 简单使用

  1. 模型

    package demo.java.reflections.model;import java.io.Serializable;public class BaseModel implements Serializable {}public class Account extends BaseModel {}public class User extends BaseModel {}
    
  2. 测试 (Java Main)

    package demo.java.reflections;import demo.java.reflections.model.BaseModel;
    import org.reflections.Reflections;
    import org.reflections.scanners.SubTypesScanner;
    import org.reflections.util.ClasspathHelper;
    import org.reflections.util.ConfigurationBuilder;
    import org.reflections.util.FilterBuilder;public class ReflectionsTest {/*** 如下示例* 1. 基本使用 和 高级使用 的方式是等价的* 2. 运行耗时主要在new Reflections()* 3. Reflections(Scanner:扫描器, URL:扫描路径), 扫描器和扫码路径 越少越好, 这个非常影响耗时!!!* 4. 这种反射扫描框架, 还是少用为好. 可以考虑用 "Spring IOC", "Java SPI", "配置文件解析" 等方式解决.* @param args*/public static void main(String[] args) {// 基本使用Reflections reflections1 = new Reflections("demo.java.reflections.model");System.out.println(reflections1.getSubTypesOf(BaseModel.class));// 高级使用Reflections reflections2 = new Reflections(new ConfigurationBuilder().setUrls(ClasspathHelper.forPackage("demo.java.reflections.model")).setScanners(new SubTypesScanner()).filterInputsBy(new FilterBuilder().includePackage("demo.java.reflections.model")));System.out.println(reflections2.getSubTypesOf(BaseModel.class));}
    }
    1. 测试 (SpringBoot Main)
    package demo.java.reflections;import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
    public class ReflectionsApp {public static void main(String[] args) {SpringApplication.run(ReflectionsApp.class, args);ReflectionsTest.main(args);}
    }
    

3. 常见错误

  1. 错误 (zip file closed)
  • 问题现象
    idea跑java main方法正常, idea跑springboot main方法正常. cmd跑springboot fat-jar, 报如下异常

  • 解决方案

    ​ 目前: 把reflections从0.9.12降到0.9.11. 详细参考issues

Exception in thread "main" java.lang.reflect.InvocationTargetExceptionat sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49)at org.springframework.boot.loader.Launcher.launch(Launcher.java:107)at org.springframework.boot.loader.Launcher.launch(Launcher.java:58)at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:88)
Caused by: org.reflections.ReflectionsException: Scanner SubTypesScanner was not configuredat org.reflections.Store.get(Store.java:39)at org.reflections.Store.get(Store.java:61)at org.reflections.Store.get(Store.java:46)at org.reflections.Store.getAll(Store.java:93)at org.reflections.Reflections.getSubTypesOf(Reflections.java:404)at demo.java.reflections.ReflectionsTest.main(ReflectionsTest.java:32)at demo.java.reflections.ReflectionsApp.main(ReflectionsApp.java:11)... 8 more
  1. 错误 (尝试获取所有java.lang.Number的子类, 失败)

    • 问题现象

      idea跑java main方法正常, idea跑springboot main方法正常. cmd跑springboot fat-jar异常

    • 问题原因

      idea跑项目时, 会带上classpath, 这方便reflections从jar包中查找java.lang.Number的子类

      另, springboot入口org.springframework.boot.loader.JarLauncher#main

      有自定义的ClassLoader(LaunchedURLClassLoader)

4. 参考

  1. reflections

  2. reflections-issues | java.lang.IllegalStateException: zip file closed

  3. reflections-issues | spring boot use happen error

  4. Is it possible to get all the subclasses of a class? [duplicate]

Reflections反射扫描库相关推荐

  1. 反射 及 Reflections反射框架

    一.类加载过程 要知道反射机制,还需要理解类的加载过程.总的来说,类加载的五个过程:加载.验证.准备.解析.初始化. 除了加载(装载)阶段,用户可以通过自定义的类加载器参与,其他阶段都完全由虚拟机主导 ...

  2. ReflectASM高性能反射Java库

    1. 简介   在日常开发中,经常需要使用反射操作类中的属性或方法.ReflectASM是一个非常小的 Java 库,它提供高性能反射能力.   Github地址:https://github.com ...

  3. 前端二维码扫描库html5-qrcode使用(据说已不能用)

    最新更新: 本文首发是在2017年,当时这个库是可以用的.现在据网友评论好像已经不可以用了,所以大家还是跳过吧,或者去库的官网看看有没有最新更新. ####本文介绍前端二维码扫描库html5-qrco ...

  4. Reflections 反射api使用总结

    java面试题网站:www.javaoffers.com package com.mh.others.reflect_;import com.mh.others.log.LOGUtils; impor ...

  5. AspectCore.Extension.Reflection : .NET Core反射扩展库

    在从零实现AOP的过程中,难免会需要大量反射相关的操作,虽然在.net 4.5+/.net core中反射的性能有了大幅的优化,但为了追求极致性能,自己实现了部分反射的替代方案,包括构造器调用.方法调 ...

  6. java反射扫描包,获取枚举属性

    引言 由于现在正在接触的项目是前后端分离,我们自己定义了一些实体类的状态码(意思就是前后台传输成功.失败.或者别的信息,都是用具体的数字代表,有点像HTTP状态码),由于这些东西前台写一份后台写一份会 ...

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

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

  8. org.reflections 接口通过反射获取实现类源码研究

    org.reflections 接口通过反射获取实现类源码研究 版本 org.reflections reflections 0.9.12 Reflections通过扫描classpath,索引元数据 ...

  9. Reflections一个强大的类扫描工具介绍

    目录 一.Reflections能够做什么 二.如何使用 2.1. 在maven项目中添加如下依赖 2.2.使用示例 2.2.1.实例化 2.2.2.根据父类获取所有子类 2.2.3.根据接口获取所有 ...

最新文章

  1. java url json字符串_使用HttpClient将URL中的JSON查询字符串发送到Web服务(Java)
  2. 练习友元函数,有元类,快排和全排列问题
  3. 怎么自学python软件-python怎样才能学好?python软件开发什么
  4. httpClient post方法 解析json数据(向服务器传递,接受服务器传递)
  5. 使用Python操作MySQL数据库
  6. c# partial class 的用法
  7. dos通过for命令截取字符串
  8. js中的generator
  9. 计算机电子琴音乐,电脑电子琴软件
  10. python小测试1答案_测试1:Python 基本语法(选择题
  11. mybatis开启字段自动映射为java驼峰命名规则
  12. php获取ajax data,HTML 获取 PHP 接口数据(ajax)
  13. 百度陆奇:AI是5G网络下最好的加速器,技术商业化还要更快
  14. bazel 链接第三方动态库_C/C++编程知识:Linux 动态库相关知识整理
  15. PyCharm 与 Git/GitHub 关联 / 取消关联
  16. Android 中文 API——android.widget合集(上)(20篇)
  17. php的登陆代码,PHP登陆页面完整代码
  18. mysql导入.sql文件中文乱码_mysql通过sql文件导入数据时出现乱码的解决办法
  19. 软件测试的岗位划分和主要工作内容是怎样的?
  20. Ps(Adobephoto shop)当中布尔运算的使用方法

热门文章

  1. python自学入门12周_新手怎么100天入门Python?
  2. 怎么把线稿提取出来_手把手教你如何使用photoshop提取线稿
  3. 乾坤qiankun框架搭建项目
  4. golang的xml解析
  5. ERP与CRM集成经验
  6. 持续集成工具hudson
  7. viterbi算法通俗理解
  8. linux cpu开启性能模式
  9. BUUCTF:[极客大挑战 2019]RCE ME
  10. python讲师金角大王_(学习)金角大王python练习题