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