Ich suche nach einer Möglichkeit, alle Unterpakete eines beliebigen Pakets in Java aufzulisten.Alle Unterpakete eines Pakets auflisten
Etwas wie folgt aus:
Package basePackage = getPackage("com.mypackage");
for(Package subPackage : basepackage.getSubPackages()){
System.out.println(subPackage.getName());
}
Gibt es eine Möglichkeit, es zu tun? Danke im Voraus.
Wie macht IDE (sagen wir Netbeans) es?
UPDATE:
Ich versuche, alle Mapper-Paket für Mybatis zu finden. In meinem Projekt müssen alle Mapper-Pakete "* .mappers" heißen. Zum Beispiel: "a.b.mappers" oder "a.b.c.mappers". Die Sache ist, ich kenne nur das Basispaket und nicht sicher, wie viele Mapper-Pakete darunter liegen.
UPDATE: Hier ist mein Code versucht Reflexion Bibliothek zu verwenden, 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 wird hier ....
UPDATE
Hier ist mein Code, es zu tun. Irgendwie langsam, aber die Leistung ist in meinem Fall nicht so wichtig. Ich habe den Frühling noch nie vorher benutzt, also wenn es bessere Möglichkeiten gibt, lass es mich wissen. Vielen Dank.
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));
}
Der meiste Code wird von How do I read all classes from a Java package in the classpath? kopiert
hast du dies: http://stackoverflow.com/questions/4212088/java-programmatically-determine-all-of-the-package-names-loaded-on-the-classpa – Azodious