2012-07-25 12 views
6

Tengo varias preguntas con respecto a los cargadores de clase.¿qué cargador de clase se usa?

Class.forName("class.name"); 

y

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

Lo cargadores de clases se utilizará en cada caso? Para el primer caso, asumo el cargador de clases que se utilizó para cargar la clase en la que se está ejecutando el código del método. Y en el segundo caso, asumo el cargador de clases de contexto de subprocesos.

En caso de que me equivoque, se agradece una pequeña explicación.

+5

Consulte http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html#forName%28java.lang.String%29 para el primer caso (su suposición es correcta). Consulte también [esta pregunta] (http://stackoverflow.com/questions/1771679/difference-between-threads-context-class-loader-and-normal-classloader) para obtener una buena explicación. – DNA

Respuesta

2

Ambos usan la corriente ClassLoader. Como señala correctamente DNA, http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html#forName%28java.lang.String%29 indica que Class.forName() usa el cargador de clases actual. Un pequeño experimento demuestra que una clase cargada de ejemplificación mediante la instrucción new también utiliza la corriente 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()); 
    } 
} 

En Test nos propusimos ContextClassLoader hilo de la corriente a alguna costumbre ClassLoader y luego una instancia de un objeto de la clase SomeClass. En SomeClass imprimimos ContextClassLoader del subproceso actual y ClassLoader que cargó la clase de este objeto. El resultado es

[email protected] 
[email protected] 

lo que indica que la corriente ClassLoader (sun.misc.Launcher.AppClassLoader) se utilizó para cargar la clase.

+0

¿Qué quiere decir con "el actual' ClassLoader' "? – jameshfisher

+0

@jameshfisher "el cargador de clase definidora de la clase actual" – Uli

+0

¿Qué quiere decir con "clase actual"? Alcance léxico? – jameshfisher

Cuestiones relacionadas