[JVM] ClassLoader

TommyMo

Erfahrenes Mitglied
Hi Leute!

Ich bin grad in einer ziemlich kniffligen Siutation. Um dieser Situation Herr zu werden, wäre es gut zu wissen welche Klassen gerade auf der VM geladen sind. Gibt es da eine Möglichkeit sich alle auf der VM geladenen Ressourcen ausgeben zu lassen? Ich habe mir den ClassLoader mal näher angeschaut, der bietet mir aber diese Funktionalität nicht. Gibts Alternativen?

Nochmal kurz: Alle zur Laufzeit verfügbaren Ressourcen auf der VM auslesen/anzeigen, möglich?

Danke für die Hilfe!

Gruß
TOM
 
Hallo!

Dass mal auf die Schnelle...
Java:
/**
  * 
  */
 package de.tutorials;
 
 import java.lang.reflect.Field;
 import java.util.Iterator;
 import java.util.Vector;
 
 /**
  * @author daritho
  * 
  */
 public class ClassLoaderExample {
 
     static Field classes;
     static {
         try {
             classes = ClassLoader.class.getDeclaredField("classes");
             classes.setAccessible(true);
         } catch (Exception e) {
             e.printStackTrace();
         }
     }
 
     /**
      * @param args
      */
     public static void main(String[] args) throws Exception {
         showLoadedClassesAccordingToClassLoaderHierarchyOf(ClassLoaderExample.class
                 .getClassLoader());
     }
 
     private static void showLoadedClassesAccordingToClassLoaderHierarchyOf(
             ClassLoader classLoader) throws Exception {
         if (classLoader != null) {
             showLoadedClassedFor(classLoader);
             showLoadedClassesAccordingToClassLoaderHierarchyOf(classLoader
                     .getParent());
         } else {
             System.out
                     .println("SystemClassLoader -> No way to determine a list of classes loaded by the SystemClassLoader? We will see ;) Stay tuned");
         }
     }
 
     private static void showLoadedClassedFor(ClassLoader classLoader)
             throws Exception {
         Vector loadedClasses = getLoadedClassesOfClassLoader(classLoader);
         System.out.println("Classes (" + loadedClasses.size()
                 + ") loaded by ClassLoader=" + classLoader.toString());
         for (Iterator iter = loadedClasses.iterator(); iter.hasNext();) {
             Class clazz = (Class) iter.next();
             System.out.println(clazz.getName());
         }
     }
 
     static Vector getLoadedClassesOfClassLoader(ClassLoader classLoader)
             throws Exception {
         return (Vector) classes.get(classLoader);
     }
 }
Wenn der Aufruf von getClassLoader() null zurückgibt wurde die Klasse vom (internen) SystemClassLoader geladen. Das heißt, dass deine Klasse über den Bootstrap Classpath erreichbar ist.
Gruss Tom
 
Hallo! Unter Java 5 kannst du dass ClassLoading auf Verbose schalten...:
Java:
    static {
        ManagementFactory.getClassLoadingMXBean().setVerbose(true);
    }

Gruß Tom
 
Hi Tom!

Danke für die schnelle Antwort!

Der ClassLoader ist tatsächlich null. Was heißt das genau? Soweit ich jetzt weiß verwende ich nur einen ClassLoader, d.h. ich habe keine weiteren implementiert ... . Kann man auf den internen ClassLoader auch irgendwie zugreifen?

Gruß
TOM
 
Aber trotzdem noch eine Frage, was passiert an den Stellen hier genau? Ich habe so ein Konstrukt noch nie gesehn ... wäre interessant, weils ja funktionert :)

Code:
static { 
   // code to handle
}

Thx
TOM
 
Hallo!

TommyMo hat gesagt.:
Aber trotzdem noch eine Frage, was passiert an den Stellen hier genau? Ich habe so ein Konstrukt noch nie gesehn ... wäre interessant, weils ja funktionert :)

Code:
static { 
   // code to handle
}
Thx
TOM
Das ist ein sogenannter static initializer Block. Er wird ausgeführt, wenn die entsprechende Klasse von einem ClassLoader geladen und initialisiert wird und das genau einmal. Es sei denn die Class Instanz wurde vom Garbage Collector aufgesammelt, weil a) keine Instanzen davon mehr existierten, das die Class-Instanz nicht mehr referenziert wird und c) der dazugehörige ClassLoader nicht mehr von einem Thread aus erreicht/referenziert werden kann.


Schau mal hier:
http://www.tutorials.de/forum/showpost.php?p=1040519&postcount=3

Gruss Tom
 
Zurück