Java使用Reflections库从0.9.x升级到0.10.x的资源扫描适配问题
问题原因
你遇到的问题是Reflections 0.10.x版本的API设计变更导致的:Scanners.Resources.filterResultsBy()设置的是扫描阶段的结果过滤规则,仅作用于资源收集存入索引的环节;而getResources(String regex)方法会从全部已扫描到的资源中执行正则匹配,会忽略之前Scanner配置的过滤规则,因此你写的Predicate没有生效。
可行解决方案
方案1:手动过滤(推荐)
直接在拿到全量资源后通过Stream的filter方法执行自定义Predicate,和0.9.x版本的逻辑完全对齐,可维护性最高,不需要额外适配新API的特殊规则:
Reflections r = new Reflections("com.example.so", Scanners.Resources); Set<String> set = r.getResources(".*") .stream() .filter(s -> s.contains("foo") && s.endsWith(".bar")) .map(s -> '/' + s) .collect(Collectors.toSet()); System.out.println(set);
方案2:使用过滤后的Scanner结果
如果要复用扫描阶段配置的Predicate规则,直接调用getAll(Scanners.Resources)获取已经过滤好的结果即可,不需要调用带正则参数的getResources方法:
Reflections r = new Reflections("com.example.so", Scanners.Resources.filterResultsBy(s -> s.contains("foo") && s.endsWith(".bar"))); Set<String> set = r.getAll(Scanners.Resources) .stream() .map(s -> '/' + s) .collect(Collectors.toSet()); System.out.println(set);
两种方案的适用场景:
- 方案1适合过滤规则需要频繁调整、资源数量不大的场景,逻辑清晰易调试
- 方案2适合资源数量较大的场景,扫描阶段就过滤掉无效资源,内存占用更低
内容的提问来源于stack exchange,提问作者Robert Hume
相关产品推荐
相关产品推荐

