2011-01-22 17 views
8

"Ana" yöntemde komut satırı argümanlarını bulabildiğimi biliyorum, ancak dolaylı olarak'u edinmem gerekiyor.Java, C# 'ın Environment.GetCommandLineArgs() öğesine denk mi?

Yardımlarınız için teşekkürler.

+2

sen eğer tasarımınızı yeniden düşünmek isteyebilirsiniz Böyle bir şey yapmak zorunda. – Mike

+2

Bence cevap, yapamayacağın. –

+0

@Mike Argümanlara gereksinim duyan sınıfın, gerçek komut satırı argümanlarına erişebilmesi gerekir; bu, bunları başlatan nesnelerin kendilerine erişimi olmasa bile. Sınıfım bir kütüphanenin parçası olduğu için, kütüphaneyi kullanan sınıfların, sınıfımı kullanmaları gerekmesine rağmen, komut satırı argümanlarına erişebileceklerinden emin olmanın bir yolu yoktur. Ayrıca, bu problem, diğer sınıf tasarımlarını değiştirmeye zorlamak için genel tasarım için yeterince önemli değildir. – Mackenzie

cevap

2

Ana aramayı listeleyebilir, ana parçacığı bulabilir ve ana aramayı bulana kadar yığın izlemeyi tarayabilir ve yayınları dışarı çıkarabilirsiniz. Bir yorum, bunun tek başına işe yaramayacağını ve yorumun doğru olduğunu düşündüğüne işaret etmektedir. Stack Introspection'ın yeteneklerini ya da JVMTI'de zihinsel olarak karışık yeteneklerini yanlış değerlendirdim.

Yani, burada plan B. Kendinize JMX ile bağlanın. Sanal Makine Özeti MBean'ın, args vardır.

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

bu dedi sahip tüm, ne gerektiğini yapmak System.getProperty arayacak ve mağaranın içine aşağı dış dünyadan parametreleri geçirmek için -D kullanmaya gerek yaşamak olduğunu. Tabii

Sen cli alıp yeniden biçim o -DPROP kullanmak için bir sarıcı yazabilirsiniz
+2

Tartışmaları nasıl çıkarırsınız? "StackTraceElement" nesnesinde değiller. –

-1

= 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 
} 

, her zaman sadece bir bash/toplu komut dosyası çağırmak için size kullanıcıları söyleyebilirdi uygun -Da = ifadenin ardından gerçek tip argümanlar

8

istediğini tam olarak:

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

+1

Bu yalnızca bazen çalışır, çünkü bu mevcut olması garanti edilen bir özellik değildir. Buna tek başına güvenmem. Genel olarak, tasarım perspektifinden, değerleri bir yerlerde saklamak daha iyidir. – Jochen

İlgili konular