2012-07-25 14 views
6

Ich habe einige Fragen zu Klassenladern.Welcher Klassenlader wird verwendet?

Class.forName("class.name"); 

und

.... 
NotYetLoadedClass cls = new NotYetLoadedClass(); 
..... 

Welche Klassenlader wird in jedem Fall verwendet werden? Für den ersten Fall nehme ich den Klassenlader an, der verwendet wurde, um die Klasse zu laden, in der der Methodencode ausgeführt wird. Und im zweiten Fall nehme ich Three Context Class Loader an.

Wenn ich falsch liege, wird eine kleine Erklärung geschätzt.

+5

Siehe http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html#forName%28java.lang.String%29 für den ersten Fall (Ihre Annahme ist richtig). Siehe auch [diese Frage] (http://stackoverflow.com/questions/1771679/difference-between-threads-context-class-loader-and-normal-classloader) für eine gute Erklärung. – DNA

Antwort

2

Beide verwenden die aktuelle ClassLoader. Wie die DNA korrekt angibt, gibt http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html#forName%28java.lang.String%29 an, dass Class.forName() den aktuellen Klassenlader verwendet. Ein kleines Experiment zeigt, dass eine Klasse für Instanziierung geladen mit der new Anweisung auch die aktuelle ClassLoader verwendet:

public class Test 
{ 
    public static void main(String[] args) throws Exception 
    { 
     Thread.currentThread().setContextClassLoader(new MyClassLoader()); 
     SomeClass someClass = new SomeClass(); 
     someClass.printClassLoader(); 
    } 

    public static class MyClassLoader extends ClassLoader 
    { 
     public MyClassLoader() 
     { 
      super(); 
     } 

     public MyClassLoader(ClassLoader parent) 
     { 
      super(parent); 
     } 
    } 
} 



public class SomeClass 
{ 
    public void printClassLoader() 
    { 
     System.out.println(this.getClass().getClassLoader()); 
     System.out.println(Thread.currentThread().getContextClassLoader()); 
    } 
} 

In Test wir den aktuellen Thread ContextClassLoader auf einige benutzerdefinierte ClassLoader gesetzt und dann ein Objekt der Klasse SomeClass instanziiert. In SomeClass drucken wir den ContextClassLoader des aktuellen Threads und ClassLoader, die die Klasse dieses Objekts geladen haben. Das Ergebnis ist

[email protected] 
[email protected] 

anzeigt, dass die aktuelle ClassLoader (sun.misc.Launcher.AppClassLoader) wurde verwendet, um die Klasse zu laden.

+0

Was meinst du mit "der aktuelle' ClassLoader' "? – jameshfisher

+0

@jameshfisher "der definierende Klassenlader der aktuellen Klasse" – Uli

+0

Was meinst du mit "der aktuellen Klasse"? Lexikalischer Umfang? – jameshfisher

Verwandte Themen