gpt4 book ai didi

java - 列出一个包的所有子包

转载 作者:IT老高 更新时间:2023-10-28 13:50:22 27 4
gpt4 key购买 nike

我正在寻找一种方法来列出 Java 中任意包的所有子包。

类似这样的:

Package basePackage = getPackage("com.mypackage");
for(Package subPackage : basepackage.getSubPackages()){
System.out.println(subPackage.getName());
}

有办法吗?提前致谢。

IDE(比如 Netbeans)是如何做到的? enter image description here

更新:

我正在尝试查找 MyBatis 的所有映射器包。在我的项目中,所有映射器包都必须命名为“*.mappers”。例如:“a.b.mappers”或“a.b.c.mappers”。问题是我只知道基础包,不知道它下面有多少个映射器包。

更新:这是我尝试使用反射库的代码:

private Set<String> getPackagesNames() {
Reflections reflections = new Reflections("com.mypackage");
Set<Class<? extends Object>> allClasses = reflections.getSubTypesOf(Object.class);
Set<String> packageNames = new HashSet<>();

for( Iterator<Class<? extends Object>> it = allClasses.iterator(); it.hasNext(); ) {
Class<? extends Object> subClass= it.next();
packageNames.add(subClass.getPackage().getName());
}

return packageNames;
}

不知道为什么这不起作用。这里没有找到类....

更新

这是我的代码。有点慢,但就我而言,性能并不是那么大的问题。我以前从未使用过 Spring,所以如果有更好的方法,请告诉我。谢谢。

    private static Set<String> getPackages(String basePackage) throws IOException, ClassNotFoundException {
Set<String> packagesNames = new HashSet<>();

ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(resourcePatternResolver);

String packageSearchPath = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + resolveBasePackage(basePackage) + "/" + "**/*.class";
Resource[] resources = resourcePatternResolver.getResources(packageSearchPath);
for( Resource resource : resources ) {
MetadataReader metadataReader = metadataReaderFactory.getMetadataReader(resource);
Class aClass = Class.forName(metadataReader.getClassMetadata().getClassName());
String packageName = aClass.getPackage().getName();
packagesNames.add(packageName);
}
}
return packagesNames;
}

private static String resolveBasePackage(String basePackage) {
return ClassUtils.convertClassNameToResourcePath(SystemPropertyUtils.resolvePlaceholders(basePackage));
}

大部分代码都是从How do I read all classes from a Java package in the classpath?复制过来的

最佳答案

我想获取包最简单的方法是获取类加载器的所有包

Package.getPackages()

并用你的包名过滤它

packageName.startsWith("com.yourcompany.yourpackage")

关于java - 列出一个包的所有子包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15893174/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com