2015-01-26 16 views
7

Data:Accesso principali argomenti da un inizializzatore statico

public class MyClass { 

    static { 
    // Access to args is needed here 
    } 

    public static void main(String[] args) { 
    ... 
    } 
} 

mi piacerebbe accedere args nel blocco statico di cui sopra.

Sono consapevole del fatto che il blocco statico viene eseguito quando la classe viene caricata (o inizializzata) e prima della funzione statica principale, ma si sta ancora chiedendo se fosse possibile accedere ai suoi argomenti.

Btw - il mio obiettivo finale è quello di aggiungere al nome del file di registro in fase di esecuzione, prima che log4j sia configurato (utilizzando la variabile di proprietà di sistema derivata da uno degli argomenti passati al principale).

+1

No, ma si può fare affidamento sulle proprietà di sistema direttamente. – biziclop

risposta

4

C'è un sole speciale proprietà di sistema". java.command "che contiene l'intera riga di comando.

Ecco un esempio:

static { 
    System.out.println(System.getProperty("sun.java.command")); 
} 

Quando ho eseguito il mio programma con argomenti aaa bbb ho ottenuto il seguente risultato:

com.MyClass aaa bbb 
+0

BTW - Sai se questo è indipendente dall'implementazione della macchina virtuale? –

+0

Mi dispiace, ho dimenticato di menzionare che questo è per Sun/Oracle JVM. Credo tuttavia che questo sia supportato da OpenJDK e non ho idea di cosa sia l'IBM e JRokit. – AlexR

+0

Mi chiedo solo se questo è un antipattern o no. Da una parte abbiamo bypassato la catena di iniezione dell'array di args, ma d'altra parte gli inizializzatori statici invocati sul caricamento delle classi, che a sua volta accade prima dell'esecuzione del metodo principale sembra logicamente inutile. –

4

Non puoi accedere agli argomenti del main dal blocco statico. Invece (o inaddition) di passaggio di argomenti al principale, vorrei suggerire di utilizzare il parametro di sistema come:

java -Dmyvar=value ... 

e accedervi all'interno del blocco statico come

static { 
    String parameterValue = System.getProperty("myvar"); 
    ... 
} 
Problemi correlati