2012-07-25 14 views
6

Ho diverse domande riguardo ai caricatori di classe.quale caricatore di classi viene utilizzato?

Class.forName("class.name"); 

e

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

Cosa caricatori classe saranno utilizzati in ogni caso? Per il primo caso, suppongo che il programma di caricamento classi sia stato utilizzato per caricare la classe in cui il codice del metodo è in esecuzione. E nel secondo caso suppongo caricatore di classi di contesto thread.

Nel caso in cui mi sbaglio, una piccola spiegazione è apprezzata.

+5

Vedere http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html#forName%28java.lang.String%29 per il primo caso (l'ipotesi è corretta). Vedi anche [questa domanda] (http://stackoverflow.com/questions/1771679/difference-between-threads-context-class-loader-and-normal-classloader) per una buona spiegazione. – DNA

risposta

2

Entrambi utilizzano l'attuale ClassLoader. Come indica correttamente il DNA, http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html#forName%28java.lang.String%29 afferma che Class.forName() utilizza il caricatore di classe corrente. Un piccolo esperimento mostra che una classe di carico per l'esecuzione dell'istanza utilizzando l'istruzione new utilizza anche la corrente ClassLoader:

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 abbiamo impostato ContextClassLoader filo della corrente a qualche personalizzato ClassLoader e quindi un'istanza di un oggetto della classe SomeClass. In SomeClass stampiamo il ContextClassLoader del thread corrente e lo ClassLoader che ha caricato la classe di questo oggetto. Il risultato è

[email protected] 
[email protected] 

indica che l'attuale ClassLoader (sun.misc.Launcher.AppClassLoader) è stato utilizzato per caricare la classe.

+0

Cosa intendi con "l'attuale' ClassLoader' "? – jameshfisher

+0

@jameshfisher "il caricatore di classe definitivo della classe corrente" – Uli

+0

Cosa intendi con "la classe corrente"? Ambito lessicale? – jameshfisher

Problemi correlati