Liste de tous les modules d'un paquet
Je suis à la recherche d'un moyen de la liste de tous les modules de l'arbitraire d'un package en Java.
Quelque chose comme ceci:
Package basePackage = getPackage("com.mypackage");
for(Package subPackage : basepackage.getSubPackages()){
System.out.println(subPackage.getName());
}
Est-il un moyen de le faire? Merci à l'avance.
Comment IDE(disons Netbeans) le faire?
Mise à JOUR:
Je suis en train d'essayer de trouver tous les mappeurs de package pour MyBatis. Dans mon projet, tous les mappeurs de paquets a pour nom "*.les cartographes". Par exemple: "un.b.les cartographes" ou "un.b.c.les cartographes". Le truc c'est que je ne connais que le forfait de base, et pas sûr de savoir comment beaucoup de mappeurs de paquets sous elle.
Mise à JOUR:
Voici mon code en essayant d'utiliser la réflexion de la bibliothèque de le faire:
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;
}
Ne sais pas pourquoi cela ne fonctionne pas. Aucune classe n'est trouvé ici....
Mise à JOUR
Voici mon code pour le faire. Lente, mais la performance n'est pas que le grand souci dans mon cas. Je n'ai jamais utilisé le Printemps avant que, donc, si il ya de meilleures façons de le faire, faites le moi savoir. Merci.
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));
}
La plupart du code est copié à partir de Comment puis-je lire toutes les classes d'un package Java dans le classpath?
- avez-vous vu ceci: stackoverflow.com/questions/4212088/...
Vous devez vous connecter pour publier un commentaire.
Je suppose que la meilleure façon d'obtenir des paquets est d'obtenir tous les paquets de votre chargeur de classe avec
et le filtre avec votre nom de paquet avec
1) Charge d'une catégorie quelconque de l'emballage et obtenir son URL
2) Déterminer si c'est un fichier ou un bocal.
2) utiliser le Fichier.liste() pour le répertoire ou Jarfiles.getEntries jar pour trouver des sous-paquets
Une autre façon de résoudre ce problème serait d'utiliser le système de chargeur de classe de charger tous les pots /les fichiers zip dans le classpath et ensuite il vous suffit d'inspecter ces.
De la Performance ne sera pas grande. Parce que nous sommes l'inspection jar /fichiers zip, mais il fonctionne.
Voici un exemple de code:
Ce sera quelque chose de sortie:
D'élaborer: IDE est en fait de lire les fichiers JAR des dépendances. Dans le fichier JAR c'est juste une structure de répertoire. Ceci est différent de la façon dont le chargeur de classe Java stocke.