Start - Publikationen - Wissen - TOGAF - Impressum -

Zur Durchmusterung aller Klassen des Klassenpfades wird zunächst der Klassenpfad in seine Bestandteile zerlegt:

  public static void main(String[] args) throws Exception {

String classpath = System.getProperty("java.class.path"); String[] paths = classpath.split(System.getProperty("path.separator")); for (String path : paths) { File file = new File(path); findClasses(file, file.getAbsolutePath().length()); } }

Nun werden die Pfadbestandteile unterschieden nach i) Verzeichnissen, ii) JAR Dateien und iii) Dateien, die mit .class enden. Verzeichnisse werden rekursiv durchsucht, in den JAR Dateien werden die Inhalte durchmustert. Ist eine Class-Datei gefunden, muss noch ihr Paketname aus ihrem Verzeichnispfad (abzüglich Wurzelverzeichnis) rekonstruiert werden.

  private static void findClasses(File file, int rootPathLength) throws Exception {

if (! file.exists() || ! file.canRead()) { return; }

if (file.isDirectory()) { for (File child : file.listFiles()) { findClasses(child, rootPathLength); } } else { if (file.getName().toLowerCase().endsWith(".jar")) { JarFile jar = new JarFile(file); if (jar != null) { Enumeration entries = jar.entries(); while (entries.hasMoreElements()) { JarEntry entry = entries.nextElement(); String jarEntryName = entry.getName(); if (jarEntryName.endsWith(".class")) { String className = jarEntryName.substring(0, jarEntryName.length() - 6); introspecClass(className.replace("/", ".")); } } jar.close(); } } else { String fileName = file.getAbsolutePath(); if (fileName.endsWith(".class")) { // Rekonstruktion des Paketnamens aus den Pfaden String className = fileName.substring(rootPathLength + 1, fileName.length() - 6); introspecClass(className.replace("/", ".")); } } } }

Statt einfach nur den Klassennamen auszugeben, kann man auch etwas anderes mit der so gefundenen Klasse anstellen:

  private static void introspecClass(String clazzName) throws Exception {
    try {
      Class clazz = Class.forName(clazzName);
      System.out.println(clazz);
    } catch(Throwable t) {
      System.err.println(clazzName);
    }
  }
copyright © 2003-2021 | Dr. Christian Dürr | prozesse-und-systeme.de | all rights reserved