2015-01-26 9 views
7

Given:Wejście główne argumenty ze statycznego inicjatora

public class MyClass { 

    static { 
    // Access to args is needed here 
    } 

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

Chciałbym dostęp args w wyżej wymienionym statycznego bloku.

Jestem świadomy, że blok statyczny jest wykonywany, gdy klasa jest załadowana (lub zainicjowana) i przed główną funkcją statyczną, ale wciąż zastanawiał się, czy możliwe było uzyskanie dostępu do jej argumentów.

Btw - moim celem końcowym jest dołączenie do nazwy pliku dziennika w czasie wykonywania, przed skonfigurowaniem log4j (przy użyciu zmiennej właściwości systemu, która pochodzi z jednego z argumentów przekazanych do głównej).

+1

Nie, ale można liczyć na właściwości systemu bezpośrednio. – biziclop

Odpowiedz

4

Istnieje specjalna właściwość systemu „słoneczny. java.command ", który zawiera całą linię poleceń.

Oto przykład:

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

Kiedy wpadłem mój program z argumentami aaa bbb Mam następujący wynik:

com.MyClass aaa bbb 
+0

BTW - Czy wiesz, że jest to niezależne od implementacji maszyny wirtualnej? –

+0

Przepraszam, zapomniałem wspomnieć, że dotyczy to JVM firmy Sun/Oracle. Uważam jednak, że jest to obsługiwane przez OpenJDK i nie mam pojęcia, co o IBM i JRokit. – AlexR

+0

Po prostu zastanawiam się, czy to antipattern, czy nie. Z jednej strony omijamy łańcuch wtryskowy tablicy args, ale z drugiej strony wywoływanie inicjalizatorów statycznych podczas ładowania klasowego, które z kolei odbywa się przed wykonaniem głównej metody wydaje się logicznie niepotrzebne. –

4

Nie można uzyskać dostępu do argumentów głównych z bloku statycznego. Zamiast (lub inaddition) przekazywania argumentów głównym, proponuję użyć parametru systemie jak:

java -Dmyvar=value ... 

i do niego dostęp w obrębie bloku statycznego jak

static { 
    String parameterValue = System.getProperty("myvar"); 
    ... 
} 
Powiązane problemy