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?
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?
- hast du dies: stackoverflow.com/questions/4212088/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich nehme an, der einfachste Weg, um Pakete zu erhalten, werden alle Pakete der Klasse loader mit
und filtern Sie es mit Ihrem Paket-Namen mit
1) Laden einer Klasse aus dem Paket und Holen Sie sich Ihre URL
2) bestimmt, ob es eine Datei oder jar.
2) verwenden Sie die Datei.Liste() für Verzeichnis-oder (jar-Datei).getEntries für jar zu finden Unterpakete
Weitere Möglichkeit, dieses problem zu lösen wäre, um die system-classloader zu laden alle jars /zip-Dateien in den classpath und dann überprüfen Sie einfach diese.
Leistung wird nicht groß sein. Weil wir inspizieren jar /zip-Dateien, aber es funktioniert.
Hier finden Sie einige Beispiel-code:
Wird diese Ausgabe etwas wie:
Erarbeiten: die IDE ist eigentlich Lesen Sie die JAR-Dateien der Abhängigkeiten. In der JAR-Datei es ist nur eine Verzeichnis-Struktur. Diese unterscheidet sich von der Art der Java-ClassLoader speichert.