java - sirve - ¿Cuándo se ejecuta el bloque estático de una clase?
para que sirve static en java (8)
Tengo 2 jarras, llamémoslas a.jar y b.jar.
b.jar depende de a.jar.
En a.jar, definí una clase, llamémosla StaticClass. En StaticClass, definí un bloque estático, llamando a un método llamado "init":
public class StaticClass {
static {
init();
}
public void static init () {
// do some initialization here
}
}
en b.jar, tengo un main, así que en general, espero que se haya llamado al método init (), pero en realidad no. Sospecho que es porque el StaticClass no ha sido cargado por el jvm, ¿podría alguien decirme
- ¿Es correcta mi conclusión?
- ¿Qué desencadena el jvm para cargar una clase?
- ¿Cómo puedo hacer que el bloque estático se ejecute automáticamente?
Gracias
Añadiendo un poco más:
bloque estático se ejecutará cuando la clase de carga jvm.
Aquí en tu ejemplo puedes llamar al método init()
de tu StaticClass
por clase de intantiating
como StaticClass staticClass = new StaticClass ();
o
StaticClass.class.newInstance();
esto es más preferebal
El bloque estático se ejecuta cuando una clase cargada se inicializa o se referencia primero. Cargando la clase no significa que la clase debe inicializarse. La carga de la clase JVM es cosas separadas que preocupan.
El código estático se ejecuta cuando se hace referencia a su clase ( StaticClass
I guess).
Por lo tanto, debe ejecutarse si crea una nueva instancia de StaticClass
o si llama a uno de sus métodos estáticos .
Sí, el inicializador estático se ejecutará cuando se cargue la clase. Esto normalmente ocurre cuando accede a la clase en el contexto de carga de clases por primera vez.
Sí, tiene razón, dado que no está utilizando StaticClass
no está cargado por vm y, por lo tanto, init()
nunca se ejecuta.
Para su segunda pregunta, probablemente tenga que ir por las malas y escanear todas las clases disponibles y cargarlas.
https://.com/a/3223019/393657
Sí, tiene usted razón. Los bloques de inicialización estáticos se ejecutan cuando la JVM (cargador de clases - para ser específico) carga StaticClass
(que ocurre la primera vez que se hace referencia en el código).
Puede forzar que se invoque este método llamando explícitamente a StaticClass.init()
que es preferible a confiar en la JVM.
También podría intentar usar Class.forName(String)
para forzar a la JVM a cargar la clase e invocar sus bloques estáticos.
Tienes razón, la forma más fácil es acceder a la clase, por ejemplo, hacer un
StaticClass.class.newInstance();
O algo así en tu método principal. Esto asegurará que la clase sea cargada por el cargador de clases.
en la clase de método principal b.jar debería extender esa StaticClass y luego automáticamente se invocará el bloque estático y init ()