Quando viene eseguito il blocco statico di una class?

Ho 2 vasi, chiamiamoli a.jar e b.jar.

b.jar dipende da a.jar.

In a.jar, ho definito una class, chiamiamola StaticClass. In StaticClass, ho definito un blocco statico, chiamando un metodo chiamato “init”:

public class StaticClass { static { init(); } public void static init () { // do some initialization here } } 

in b.jar, ho un main, quindi nel main, mi aspetto che sia stato chiamato il metodo init (), ma in realtà no. Sospetto che sia perché lo StaticClass non è stato caricato da jvm, qualcuno potrebbe dirmelo

  1. La mia conclusione è corretta?
  2. Cosa fa scattare jvm per caricare una class?
  3. Come posso ottenere il blocco statico eseguito automaticamente?

Grazie

Si hai ragione. I blocchi di inizializzazione statici vengono eseguiti quando la JVM (class loader – per essere specifici) carica StaticClass (che si verifica la prima volta che viene fatto riferimento nel codice).

È ansible forzare questo metodo ad essere invocato chiamando esplicitamente StaticClass.init() che è preferibile affidarsi alla JVM.

Si potrebbe anche provare a utilizzare Class.forName(String) per forzare la JVM a caricare la class e richiamare i blocchi statici.

Sì, hai ragione, dal momento che non stai usando il tuo StaticClass non è caricato da VM e quindi init() non viene mai eseguito.

Per la tua seconda domanda, probabilmente devi procedere nel modo più duro e scansionare tutte le classi disponibili e caricarle.

https://stackoverflow.com/a/3223019/393657

Hai ragione, il modo più semplice è accedere alla class, ad esempio fare a

StaticClass.class.newInstance();

O qualcosa a tale riguardo nel tuo metodo principale. Questo assicurerà che la class sia caricata dal classloader.

Il codice statico viene eseguito quando si fa riferimento alla class ( StaticClass I guess).

Pertanto, dovrebbe essere eseguito se si crea una nuova istanza di StaticClass o se si chiama uno dei suoi metodi statici .

Sì, l’inizializzatore statico verrà eseguito quando la class viene caricata. Ciò si verifica normalmente quando si accede alla class nel contesto di caricamento della class per la prima volta.

Il blocco statico viene eseguito quando una class caricata viene inizializzata o referenziata per prima. Il caricamento della class non significa che la class deve essere inizializzata. Il caricamento della class JVM è un argomento a parte.

nella class del metodo principale b.jar dovrebbe estendere quello StaticClass quindi automaticamente quel blocco statico e init () verrà invocato

Aggiungendo un po ‘di più:

il blocco statico verrà eseguito quando la class di caricamento jvm.

Qui nel tuo esempio puoi chiamare il metodo init() del tuo StaticClass intantiando la class

come StaticClass staticClass = new StaticClass ();

o

StaticClass.class.newInstance(); questo è più preferebal