Per impostazione predefinita, Sun's JVM carica pigramente le classi e inizializza pigramente (ad esempio chiama i loro metodi <clinit>
). Considerare la seguente classe, ClinitBomb
, che genera un Exception
durante un blocco static{}
.Come si disabilita il caricamento/inizializzazione della classe lazy in JVM di Sun?
public class ClinitBomb {
static {
explode();
}
private static void explode() {
throw new RuntimeException("boom!");
}
}
Ora, considerare come attivare 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");
}
}
Siamo garantito l'esplosione avviene prima del punto B, dal momento che forName
's documentazione dice così; la questione è se accade prima del punto A (quando Main
viene caricato.) In JVM di Sun, anche se main()
contiene un riferimento statico per ClinitBomb
, succede dopo A.
Voglio un modo per dire alla JVM di caricare e inizializza ClinitBomb
non appena inizializza Main
(quindi la bomba esplode prima del punto A.) In generale, voglio un modo per dire "ogni volta che carico/inizializzo la classe X, lo faccio anche per qualsiasi classe Y che fa riferimento".
C'è un modo per farlo?
Un blocco statico riferito a ClinitBomb in Main? –
@ Thorbjørn Ravn Andersen che non risolverà il problema generale. Ma suppongo che un programma di caricamento classi personalizzato possa iniettare blocchi statici in ogni classe caricata. – emory
A corto di aggiungere una lista enorme di 'Class.forName()' Non lo so. OTOH, perché è così importante? – Bill