[JAVA] Ich möchte die Liste der Klassen unter dem Paket rekursiv durchsuchen

Als Systemingenieur von SIer verbringe ich jeden Tag damit, täglich Geld zu verdienen, aber kürzlich hatte ich die Möglichkeit, ein Designdokument (?) Zu erstellen, das besagt: "Listen Sie die erstellten Java-Klassen auf, indem Sie ihnen einen Paketnamen geben." Es ist eine rücksichtslose Geschichte, da die manuelle Arbeit aufgrund der Anzahl der erstellten Java-Klassen mühsam ist. Aus diesem Grund habe ich beschlossen, ein Programm zu schreiben, das rekursiv nach __packages sucht und eine Liste von Klassen mit Paketnamen ausgibt. Unten ist ein Beispiel.

image

Wenn Sie beispielsweise ein Projekt mit der obigen Paketstruktur haben, sollte das Programm, das die Klassen unter "jp.co" mit dem Paketnamen ausgibt, wie folgt lauten.

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 {
        //Verwenden Sie den Klassenladeprogramm, um die Ressourcen unter dem Paket abzurufen.
        String rootPackageName = "jp.co".replace(PACKAGE_SEPARATOR, File.separator);
        ClassLoader classLoader = ClassLoader.getSystemClassLoader();
        Enumeration<URL> rootUrls = classLoader.getResources(rootPackageName);
        
        //Durchsuchen Sie das Verzeichnis rekursiv".class"Wenn Sie eine Datei finden, die mit endet
        //Speichern Sie die Zeichenfolge nach dem Formatieren in der 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);
                }
            });
        }
        
        //Geben Sie eine Liste der gefundenen Klassennamen aus.
        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

Ich möchte die Liste der Klassen unter dem Paket rekursiv durchsuchen
Ich möchte rekursiv nach Dateien in einem bestimmten Verzeichnis suchen
Ich möchte rekursiv die Oberklasse und die Schnittstelle einer bestimmten Klasse erhalten
Glassfish Tuning List, die ich vorerst behalten möchte
Ich möchte den Inhalt der Absicht var_dump
Ich möchte nach dem Dezimalpunkt abschneiden
Ich möchte den Wert in Ruby erhalten
Ich möchte eine Methode einer anderen Klasse aufrufen
[Java] Ich möchte die Differenz zum Datum berechnen
Ich möchte eine TraceId in das Protokoll einbetten
Gelernter Stream (Ich möchte List in Map <Integer, List> konvertieren)
Ich möchte die Antwort der Janken-App wissen
Ich möchte den Namen des Posters des Kommentars anzeigen
Ich möchte den Dunkelmodus mit der SWT-App verwenden
Ich möchte die Hauptmethode mit Reflektion aufrufen
[Grober Kommentar] Ich möchte die Zupfmethode heiraten
Ich möchte die Bildlaufposition von UITableView zurückgeben!
Ich möchte die Protokollausgabe unter Android vereinfachen
Ich möchte der Kommentarfunktion eine Löschfunktion hinzufügen
[Rails] [Bootstrap] Ich möchte die Schriftgröße entsprechend ändern
(´-`) .. oO (Ich möchte die Standardausgabe" Hallo "leicht finden.
Ich möchte Tomcat auf den Server bringen und die Anwendung starten
Ich möchte die Protokollausgabeeinstellung von UtilLoggingJdbcLogger ändern
Ich möchte eine Liste mit Kotlin und Java erstellen!
Ich möchte eine Methode aufrufen und die Nummer zählen
Ich möchte die Java 8 DateTime-API (jetzt) langsam verwenden.
Ich möchte ein Formular erstellen, um die Kategorie [Schienen] auszuwählen
Ich möchte das JDK auf meinem Mac-PC installieren
Wie man einige Methoden der zu testenden Klasse verspottet
Ich möchte im gespeicherten Zustand zum selben Bildschirm wechseln
Ich möchte mehrere Rückgabewerte für das eingegebene Argument zurückgeben
[Ruby] Ich möchte die Reihenfolge der Hash-Tabelle umkehren
Ich möchte den Startbefehl mit Docker-Compose an Postgres übergeben.
Ich möchte die if-else-Anweisung für bedingte Verzweigungen in Java vereinfachen
Ich möchte die Notwendigkeit des Testens beurteilen, indem ich die Unterschiede der Klassendateien beim Refactoring von Java vergleiche.
[Java] Ich möchte überprüfen, ob die Elemente in der Liste null oder leer sind. [Collection Utils]
Ich möchte den Ablauf der Spring-Verarbeitungsanforderungsparameter verstehen
Ich möchte mit Kotlin und Java zum vorherigen Bildschirm zurückkehren!
Die Geschichte von Collectors.groupingBy, die ich für die Nachwelt behalten möchte
Wenn Sie die übergeordnete Klasse in Lomboks @builder aufnehmen möchten
[Eclipse] Ich möchte dieselbe Datei zweimal öffnen. [Split-Editor]
Ich möchte die deaktivierte Option abhängig von der Bedingung zu f.radio_button hinzufügen
Ich möchte den oberen Rand in der UITableView von Grouped entfernen (schnell)
[Java] Ich möchte mit dem Schlüssel im Objekt eindeutig arbeiten
Ich möchte die Standardfehlermeldung von Spring Boot steuern
Ich möchte den Wert von Attribute in Selenium of Ruby ändern
[Android] Ich möchte den Listener über die Schaltfläche in ListView abrufen
Verwendung der Wrapper-Klasse