列出包的所有子包

Xin*_*Xin 10 java spring

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

像这样的东西:

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

有办法吗?提前致谢.

IDE(让我们说Netbeans)如何做到这一点? 在此输入图像描述

更新:

我正在尝试找到MyBatis的所有mappers包.在我的项目中,所有映射器包都必须命名为"*.mappers".例如:"abmappers"或"abcmappers".问题是我只知道基础包,并且不确定它下面有多少个映射器包.

更新:这是我的代码试图使用反射库来做到这一点:

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;
}
Run Code Online (Sandbox Code Playgroud)

不知道为什么这不起作用.这里没有上课....

UPDATE

这是我的代码.有点慢,但在我的情况下表现并不是那么大.我之前从未使用过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));
    }
Run Code Online (Sandbox Code Playgroud)

大多数代码都是从如何从类路径中读取Java包中的所有类中复制的?

Dmi*_*hin 7

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

Package.getPackages()
Run Code Online (Sandbox Code Playgroud)

并使用您的包名称过滤它

packageName.startsWith("com.yourcompany.yourpackage")
Run Code Online (Sandbox Code Playgroud)

  • 如 http://stackoverflow.com/a/13944677/421602 所述,这将为您提供当前类加载器已知的所有包(!) - 因此,如果您尚未访问给定包中的类,它不会不要成为这个列表的一部分。 (2认同)

Evg*_*eev 0

1)从包中加载任何类并获取其URL

URL u = Test.class.getResource("");
Run Code Online (Sandbox Code Playgroud)

2)判断是文件还是jar。

2) 对目录使用 File.list() 或对 jar 使用 JarFile.getEntries 来查找子包