Reflections反射扫描库
1. 使用场景
Reflections扫描classpath, 缓存metadata, 以备运行期间使用.
- 可获取某类的所有子类
- 可获取某注解标注的所有类或字段
- 可获取某正则匹配的资源
- 可获取特定签名的方法
优点
具备Java原生反射技术, 所不具有的功能, 反射扫描.
缺点
底层实现, 会遍历classpath, 以及遍历jar包中的类, 太耗时间.
只能在启动时, 做些初始化的功能.
2. 简单使用
模型
package demo.java.reflections.model;import java.io.Serializable;public class BaseModel implements Serializable {}public class Account extends BaseModel {}public class User extends BaseModel {}
测试 (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));} }
- 测试 (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. 常见错误
- 错误 (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
错误 (尝试获取所有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. 参考
reflections
reflections-issues | java.lang.IllegalStateException: zip file closed
reflections-issues | spring boot use happen error
Is it possible to get all the subclasses of a class? [duplicate]
Reflections反射扫描库相关推荐
- 反射 及 Reflections反射框架
一.类加载过程 要知道反射机制,还需要理解类的加载过程.总的来说,类加载的五个过程:加载.验证.准备.解析.初始化. 除了加载(装载)阶段,用户可以通过自定义的类加载器参与,其他阶段都完全由虚拟机主导 ...
- ReflectASM高性能反射Java库
1. 简介 在日常开发中,经常需要使用反射操作类中的属性或方法.ReflectASM是一个非常小的 Java 库,它提供高性能反射能力. Github地址:https://github.com ...
- 前端二维码扫描库html5-qrcode使用(据说已不能用)
最新更新: 本文首发是在2017年,当时这个库是可以用的.现在据网友评论好像已经不可以用了,所以大家还是跳过吧,或者去库的官网看看有没有最新更新. ####本文介绍前端二维码扫描库html5-qrco ...
- Reflections 反射api使用总结
java面试题网站:www.javaoffers.com package com.mh.others.reflect_;import com.mh.others.log.LOGUtils; impor ...
- AspectCore.Extension.Reflection : .NET Core反射扩展库
在从零实现AOP的过程中,难免会需要大量反射相关的操作,虽然在.net 4.5+/.net core中反射的性能有了大幅的优化,但为了追求极致性能,自己实现了部分反射的替代方案,包括构造器调用.方法调 ...
- java反射扫描包,获取枚举属性
引言 由于现在正在接触的项目是前后端分离,我们自己定义了一些实体类的状态码(意思就是前后台传输成功.失败.或者别的信息,都是用具体的数字代表,有点像HTTP状态码),由于这些东西前台写一份后台写一份会 ...
- java reflections_Java反射框架Reflections示例详解
MAVEN 坐标 org.reflections reflections 0.9.10 Reflections 的作用 Reflections通过扫描classpath,索引元数据,并且允许在运行时查 ...
- org.reflections 接口通过反射获取实现类源码研究
org.reflections 接口通过反射获取实现类源码研究 版本 org.reflections reflections 0.9.12 Reflections通过扫描classpath,索引元数据 ...
- Reflections一个强大的类扫描工具介绍
目录 一.Reflections能够做什么 二.如何使用 2.1. 在maven项目中添加如下依赖 2.2.使用示例 2.2.1.实例化 2.2.2.根据父类获取所有子类 2.2.3.根据接口获取所有 ...
最新文章
- java url json字符串_使用HttpClient将URL中的JSON查询字符串发送到Web服务(Java)
- 练习友元函数,有元类,快排和全排列问题
- 怎么自学python软件-python怎样才能学好?python软件开发什么
- httpClient post方法 解析json数据(向服务器传递,接受服务器传递)
- 使用Python操作MySQL数据库
- c# partial class 的用法
- dos通过for命令截取字符串
- js中的generator
- 计算机电子琴音乐,电脑电子琴软件
- python小测试1答案_测试1:Python 基本语法(选择题
- mybatis开启字段自动映射为java驼峰命名规则
- php获取ajax data,HTML 获取 PHP 接口数据(ajax)
- 百度陆奇:AI是5G网络下最好的加速器,技术商业化还要更快
- bazel 链接第三方动态库_C/C++编程知识:Linux 动态库相关知识整理
- PyCharm 与 Git/GitHub 关联 / 取消关联
- Android 中文 API——android.widget合集(上)(20篇)
- php的登陆代码,PHP登陆页面完整代码
- mysql导入.sql文件中文乱码_mysql通过sql文件导入数据时出现乱码的解决办法
- 软件测试的岗位划分和主要工作内容是怎样的?
- Ps(Adobephoto shop)当中布尔运算的使用方法