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.
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