2011-01-22 11 views
8

So che posso ottenere gli argomenti della riga di comando nel metodo "main", ma devo essere in grado di ottenerli indirettamente.Java ha un equivalente a Environment.GetCommandLineArgs() di C#?

Grazie per il vostro aiuto.

+2

si consiglia di ripensare il vostro disegno, se si fare qualcosa di simile. – Mike

+2

Penso che la risposta sia che non puoi. –

+0

@Mike La classe che necessita degli argomenti deve avere accesso ai veri argomenti della riga di comando, anche se gli oggetti che l'istanziano non hanno accesso a essi. Poiché la mia classe fa parte di una libreria, non c'è modo di garantire che le classi che usano la libreria abbiano accesso agli argomenti della riga di comando, anche se dovranno usare la mia classe. Inoltre, questo problema non è abbastanza significativo per la progettazione generale per costringere le altre classi a modificare il loro design. – Mackenzie

risposta

2

È possibile elencare i thread, trovare il thread principale e strisciare lungo la traccia dello stack fino a trovare la chiamata a main e tirare fuori gli args.

aggiornamento un commento sottolinea che questo non funzionerà tutto da solo, e penso che il commento sia corretto. Ho erroneamente ricordato le capacità di stack introspection o mentalmente mixato in JVMTI.

Quindi, ecco il piano B. Collegati a te stesso con JMX. Il riepilogo VM MBean ha gli argomenti.

Connection name:  
pid: 77090 com.basistech.jdd.JDDLauncher -config src/main/config/benson-laptop-config.xml 

Tutto ciò premesso, ciò che si dovrebbe fare è chiamare System.getProperty e vivere con la necessità di utilizzare -D per passare parametri dal mondo esterno giù nella tua caverna.

+2

Come estraresti gli argomenti? Non si trovano in un oggetto 'StackTraceElement'. –

-1

Si potrebbe scrivere un wrapper per prendere il cli e ri-formato in modo da utilizzare -DPROP = VAL

int main(int argc, char*argv[]) 
{ 
std::vector<std::string> in (argv+1,argv+argc), out(); 

out.push_back("java.exe"); 
out.push_back("-cp"); 
out.push_back("my-jar.jar"); 
out.push_back("main.class") 

for(auto it = in.begin(); it!=in.end(); ++in) 
{ 
//process CLI args. turn "-abc","BLAH" into "-Darg.a=true","-Darg.b=true","-Darg.c=BLAH" and push to out 
//Do additional processing. Maybe evn use get_opt() or Boost.ProgramOptions 
} 
//use exec or CreateProcess to launch java with the proper args 
//or even use something like WinRun4J's methods to load the jvm.dll 
//Then your program shows up as "MyExe.exe" instead of "java.exe" 

//Use System.getProperty("arg.a","false") to get the value of a 
} 

Naturalmente, si può sempre e solo dire agli utenti di richiamare uno script bash/batch con il corretta -DA = true argomenti di tipo

8

seguente espressione è esattamente ciò che si vuole:

System.getProperty ("sun.java.command")

+1

Questo funziona solo a volte, in quanto questa non è una proprietà che è garantita per essere presente. Non mi fiderei di questo da solo. In generale, dal punto di vista del design, è meglio memorizzare i valori da qualche parte. – Jochen