[JAVA] Je souhaite rechercher de manière récursive la liste des classes sous le package

En tant qu'ingénieur système de SIer, je passe chaque jour à gagner de l'argent au quotidien, mais j'ai récemment eu l'occasion de créer un document de conception (?) Qui dit: «Listez les classes Java créées en leur donnant un nom de package». C'est une histoire imprudente car le travail manuel est gênant en raison du nombre de classes Java créées. Par conséquent, j'ai décidé d'écrire un programme qui "recherche récursivement __packages et produit une liste de classes avec des noms de package". Voici un exemple.

image

Par exemple, si vous avez un projet avec la structure de package ci-dessus, le programme qui génère les classes sous "jp.co" avec le nom du package doit être le suivant.

import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.Enumeration;
import java.util.PriorityQueue;

public class Main {
    
    private static final String PACKAGE_SEPARATOR = ".";
    
    private static final String CLASS_SUFFIX = ".class";
    
    public static void main(String[] args) throws IOException, URISyntaxException {
        //Utilisez le chargeur de classe pour obtenir les ressources sous le package.
        String rootPackageName = "jp.co".replace(PACKAGE_SEPARATOR, File.separator);
        ClassLoader classLoader = ClassLoader.getSystemClassLoader();
        Enumeration<URL> rootUrls = classLoader.getResources(rootPackageName);
        
        //Rechercher le répertoire de manière récursive".class"Si vous trouvez un fichier qui se termine par
        //Après avoir formaté la chaîne de caractères, enregistrez-la dans la liste.
        PriorityQueue<String> classNames = new PriorityQueue();
        while (rootUrls.hasMoreElements()) {
            URL rootUrl = rootUrls.nextElement();
            Path rootPath = Paths.get(rootUrl.toURI());
           
            Files.walkFileTree(rootPath, new SimpleFileVisitor<Path>(){
                @Override
                public FileVisitResult visitFile(Path path, BasicFileAttributes attrs) throws IOException {
                    String pathName = path.toString();
                    if (pathName.endsWith(CLASS_SUFFIX)) {
                        int beginIndex = pathName.lastIndexOf(rootPackageName);
                        int endIndex = pathName.lastIndexOf(CLASS_SUFFIX);
                        String className = pathName.substring(beginIndex, endIndex)
                                                   .replace(File.separator, PACKAGE_SEPARATOR);
                        
                        classNames.add(className);
                    }
                    
                    return super.visitFile(path, attrs);
                }
            });
        }
        
        //Affiche une liste des noms de classe trouvés.
        for (String className : classNames) {
            System.out.println(className);
        }
        
        /*
        jp.co.first.ClassA
        jp.co.first.ClassB
        jp.co.first.sub.ClassC
        jp.co.first.sub.ClassD
        jp.co.second.ClassE
        jp.co.second.ClassF
        */
    }
}

Recommended Posts

Je souhaite rechercher de manière récursive la liste des classes sous le package
Je souhaite rechercher de manière récursive des fichiers dans un répertoire spécifique
Je veux obtenir récursivement la superclasse et l'interface d'une certaine classe
Liste de réglages de Glassfish que je souhaite conserver pour le moment
Je veux var_dump le contenu de l'intention
Je veux tronquer après la virgule décimale
Je veux obtenir la valeur en Ruby
Je veux appeler une méthode d'une autre classe
[Java] Je souhaite calculer la différence par rapport à la date
Je veux intégrer n'importe quel TraceId dans le journal
Flux appris (je veux convertir la liste en carte <Integer, List>)
Je veux connaître la réponse de l'application Janken
Je souhaite afficher le nom de l'affiche du commentaire
Je souhaite utiliser le mode sombre avec l'application SWT
Je veux appeler la méthode principale en utilisant la réflexion
[Commentaire approximatif] Je veux épouser la méthode du pluck
Je veux retourner la position de défilement de UITableView!
Je souhaite simplifier la sortie du journal sur Android
Je souhaite ajouter une fonction de suppression à la fonction de commentaire
[Rails] [bootstrap] Je souhaite modifier la taille de la police de manière réactive
(´-`) .. oO (Je veux trouver facilement la sortie standard" Hello ".
Je veux amener Tomcat sur le serveur et démarrer l'application
Je souhaite modifier le paramètre de sortie du journal de UtilLoggingJdbcLogger
Je veux faire une liste avec kotlin et java!
Je veux appeler une méthode et compter le nombre
Je souhaite utiliser l'API Java 8 DateTime lentement (maintenant)
Je souhaite créer un formulaire pour sélectionner la catégorie [Rails]
Je veux mettre le JDK sur mon PC Mac
Comment se moquer de certaines méthodes de la classe testée
Je souhaite passer au même écran dans l'état enregistré
Je souhaite renvoyer plusieurs valeurs de retour pour l'argument saisi
[Ruby] Je souhaite inverser l'ordre de la table de hachage
Je veux passer la commande de démarrage à postgres avec docker-compose.
Je souhaite simplifier l'instruction if-else de la branche conditionnelle en Java
Je veux juger de la nécessité de tester en comparant les différences des fichiers de classe lors de la refactorisation de Java.
[Java] Je veux vérifier que les éléments de la liste sont nuls ou vides [Collection Utils]
Je veux comprendre le flux des paramètres de demande de traitement Spring
Je veux revenir à l'écran précédent avec kotlin et java!
L'histoire de Collectors.groupingBy que je veux garder pour la postérité
Si vous souhaitez inclure la classe parente dans @builder de Lombok
[Eclipse] Je souhaite ouvrir le même fichier deux fois [Éditeur fractionné]
Je veux ajouter l'option désactivée à f.radio_button en fonction de la condition
Je veux supprimer la marge supérieure dans UITableView de Grouped (swift)
[Java] Je veux effectuer distinctement avec la clé dans l'objet
Je veux contrôler le message d'erreur par défaut de Spring Boot
Je veux changer la valeur de l'attribut dans Selenium of Ruby
[Android] Je souhaite obtenir l'auditeur à partir du bouton de ListView
Comment utiliser la classe wrapper