De forma predeterminada, la JVM de Sun carga las clases con pereza y se inicializa de forma lenta (es decir, llama a sus métodos <clinit>
). Considere la siguiente clase, ClinitBomb
, que arroja un Exception
durante un bloque static{}
.¿Cómo se desactiva la carga/inicialización de la clase perezosa en la JVM de Sun?
public class ClinitBomb {
static {
explode();
}
private static void explode() {
throw new RuntimeException("boom!");
}
}
Ahora, consideremos cómo activar la bomba:
public class Main {
public static void main(String[] args) {
System.out.println("A");
try {
Class.forName("ClinitBomb");
} catch (Exception e) {
e.printStackTrace(System.out);
}
System.out.println("B");
ClinitBomb o2 = new ClinitBomb();
System.out.println("C");
}
}
Estamos garantizada la explosión sucede antes del punto B, ya que forName
's documentación dice así; la pregunta es si ocurre antes del punto A (cuando se carga Main
.) En JVM de Sun, a pesar de que main()
contiene una referencia estática a ClinitBomb
, que ocurre después de A.
quiero una manera de decirle a la JVM para cargar y inicialice ClinitBomb
tan pronto como inicialice Main
(por lo que la bomba explota antes punto A). En general, quiero decir, "cada vez que cargue/inicialice la clase X, hágalo también para las clases Y a las que hace referencia".
¿Hay alguna manera de hacerlo?
¿Un bloque estático se refiere a ClinitBomb en Main? –
@ Thorbjørn Ravn Andersen que no resolverá el problema general. Pero supongo que un cargador de clases personalizado podría inyectar bloques estáticos en todas y cada una de las clases cargadas. – emory
A falta de agregar una gran lista de 'Class.forName()' No lo sé. OTOH, ¿por qué es tan importante? – Bill