You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 11:36:06