Liste aller Unterpakete eines Pakets

Ich bin auf der Suche nach einem Weg, um die Liste alle Unterpakete zu einem beliebigen package in Java.

Etwas wie dieses:

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

Gibt es einen Weg, es zu tun? Vielen Dank im Voraus.

Wie funktioniert IDE(sagen wir mal Netbeans) es tun?
Liste aller Unterpakete eines Pakets

UPDATE:

Ich bin versuchen zu finden, all die Mapper-Paket für MyBatis. In meinem Projekt, alle Mapper-Pakete zu nennen "*.Mapper". Zum Beispiel: "ein.b.Mapper" oder "ein.b.c.Mapper". Die Sache ist, ich weiß nur das Basis-Paket, und nicht sicher, wie viele Mapper Pakete unter ihm.

UPDATE:
Hier ist mein code, versucht die Reflexion Bibliothek, es zu tun:

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;
}

Nicht sicher, warum dies nicht funktioniert. Keine Klasse ist hier zu finden....

UPDATE

Hier ist mein code, es zu tun. Art langsam, aber die Leistung ist nicht das Problem in meinem Fall. Ich habe noch nie verwendet, Frühling bevor, so dass, wenn es bessere Möglichkeiten gibt, es zu tun, lass es mich wissen. Danke.

    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));
    }

Meisten der code ist kopiert von Wie lese ich alle Klassen aus dem Java package in den classpath?

InformationsquelleAutor Xin | 2013-04-09
Schreibe einen Kommentar