2011-12-23 10 views
7

Supongamos que tengo clases con métodos estáticos solamente. ¿El cargador de clases cargará todas las clases importadas cuando carguen clases en la memoria? ¿O solo cargará importaciones cuando un método de esto necesite acceso a él?¿Cuándo carga loadloader las importaciones?

La pregunta es si el cargador de clases carga las importaciones cuando la clase se carga en la memoria o justo antes de que algunos métodos quieran usarlas. Si es la primera opción, probablemente necesitaría dividir algunas de mis clases Util, para ser más especializada.

Respuesta

14

Creo que se puede probar de la siguiente manera:

package pkg1; 

public class Test { 

    static { 
     System.out.println("Hello 111"); 
    } 

    public static void meth() { 
     System.out.println("Hello 222"); 
    } 
} 

Prueba 1:

package pkg2; 

import pkg1.Test; 

public class Tester {  

    public static void main(String... args) {     
     Test t;  
    }  
} 

que imprime nada.

Prueba 2:

package pkg2; 

import pkg1.Test; 

public class Tester {  

    public static void main(String... args) {     
     Test.meth();   
    } 

} 

Prints:

 
Hello 111 
Hello 222 

Por lo tanto, sólo porque se han importado una clase no significa que el cargador de clases se carga la clase en la memoria. Lo carga dinámicamente cuando se usa.

2

No pretendo saber mucho sobre el cargador de clases, pero si habla de sentencias de importación, entonces el cargador de clases es irrelevante.

Las declaraciones de importación existen únicamente para permitir que el desarrollador use nombres de clase cortos en lugar del nombre completo de cada clase a la que se hace referencia en la clase que se está escribiendo. El compilador utiliza esas declaraciones de importación desde el principio para resolver los nombres de las clases a las que se hace referencia antes de que se cree una sola línea de bytecode.

1

En general, el bloque de código estático en la parte superior de un archivo de clase con un informe (es decir, una instrucción de impresión) le dará una buena idea de cuándo ocurre la carga en su aplicación particular.

Sin embargo, cuando se trata de casos de esquina, como clases dinámicas, clases internas estáticas o clases fuera de la ruta de clase que se cargan dinámicamente, tendrá que tener cuidado, porque estas clases podrían cargarse MÚLTIPLES veces en una aplicación.

+0

[cita requerida] para la parte "varias veces". – meriton

Cuestiones relacionadas