Sto cercando un modo per elencare tutti i pacchetti secondari di un pacchetto arbitrario in Java.Elenca tutti i sottopacchetti di un pacchetto
Qualcosa di simile a questo:
Package basePackage = getPackage("com.mypackage");
for(Package subPackage : basepackage.getSubPackages()){
System.out.println(subPackage.getName());
}
C'è un modo per farlo? Grazie in anticipo.
Come fa IDE (diciamo Netbeans) farlo?
UPDATE:
sto cercando di trovare tutto il pacchetto mapper per MyBatis. Nel mio progetto, tutti i pacchetti dei mappatori devono nominare "* .mappers". Ad esempio: "a.b.mappers" o "a.b.c.mappers". Il fatto è che conosco solo il pacchetto di base e non sono sicuro di quanti pacchetti di mapping ci sono sotto.
UPDATE: Ecco il mio codice cercando di utilizzare libreria di riflessione per farlo:
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;
}
Non capisco perché questo non funziona. Nessuna classe si trova qui ....
UPDATE
Ecco il mio codice per farlo. Un po 'lento, ma la prestazione non è quella grande preoccupazione nel mio caso. Non ho mai usato la primavera prima, quindi se ci sono modi migliori per farlo, fammi sapere. Grazie.
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));
}
maggior parte del codice viene copiato da How do I read all classes from a Java package in the classpath?
hai visto questo: http://stackoverflow.com/questions/4212088/java-programmatically-determine-all-of-the-package-names-loaded-on-the-classpa – Azodious