如何在Java中查找包的所有类


要找到Java包中的所有类,我们可以使用Burningwave Core库的ClassHunter。因此,我们首先将以下依赖项添加到pom.xml中:

<dependency>
    <groupId>org.burningwave</groupId>
    <artifactId>core</artifactId>
    <version>8.4.0</version>
</dependency>

后续步骤如下:

  • 通过ComponentContainer检索ClassHunter
  • 定义一个必须传递给ClassCriteria 对象的正则表达式,该对象将被注入到SearchConfig 对象中
  • 调用loadInCache 方法,该方法在缓存中加载指示路径的所有可加载类,然后应用条件过滤器,然后返回SearchResult 对象,其中包含与条件匹配的类 现在,让我们查找其包中包含“ springframework ”字符串的所有类:
ComponentSupplier componentSupplier = ComponentContainer.getInstance();
ClassHunter classHunter = componentSupplier.getClassHunter();
CacheableSearchConfig searchConfig = SearchConfig.byCriteria(
    ClassCriteria.create().allThat((cls) -> {
        return cls.getPackage().getName().matches(".*springframework.*");
    })
);
try (SearchResult searchResult = classHunter.loadInCache(searchConfig).find()) {
    return searchResult.getClasses();
}

在上面的示例中,默认情况下,在所有运行时类路径中执行搜索,但是,如果我们只想在运行时类路径的某个jar中或在运行时类路径之外的其他jar中进行搜索,则可以明确地指出它们:

ComponentSupplier componentSupplier = ComponentContainer.getInstance();
PathHelper pathHelper = componentSupplier.getPathHelper();
ClassHunter classHunter = componentSupplier.getClassHunter();
CacheableSearchConfig searchConfig = SearchConfig.forPaths(
    pathHelper.getPaths(path -> path.matches(".*?spring.*?.jar"))
).by(
    ClassCriteria.create().allThat((cls) -> {
        return cls.getPackage().getName().matches(".*springframework.*")
    })
);

try (SearchResult searchResult = classHunter.loadInCache(searchConfig).find()) {
    return searchResult.getClasses();
}

让我们分解上面的示例:

在forPaths 方法,我们可以添加我们希望所有的绝对路径:两个 文件夹,拉链,JAR,耳朵,战争和JMOD文件将被递归扫描,在这种情况下,我们只扫描名称中包含字符串春天罐子 loadInCache方法将作为输入接收的SearchConfig路径中的所有类加载,然后对缓存的数据执行ClassCriteria的查询。缓存了数据后,甚至可以通过简单地调用findBy方法来利用对已加载路径的更快搜索。


原文链接:http://codingdict.com