2011-01-22 10 views
8

मुझे पता है कि मैं "मुख्य" विधि में कमांड लाइन तर्क प्राप्त कर सकता हूं, लेकिन मुझे उन्हें परोक्ष रूप से प्राप्त करने में सक्षम होना चाहिए।क्या जावा के पास सी # के पर्यावरण के बराबर है। GETCommandLineArgs()?

आपकी मदद के लिए धन्यवाद।

+2

आप अगर आप अपने डिजाइन पर पुनर्विचार कर सकते हैं ऐसा कुछ करना है। – Mike

+2

मुझे लगता है कि जवाब यह है कि आप नहीं कर सकते हैं। –

+0

@ माइक जिस वर्ग को तर्कों की आवश्यकता है, उसे सत्य कमांड-लाइन तर्कों तक पहुंच की आवश्यकता होती है, भले ही ऑब्जेक्ट्स जो इसे तुरंत चालू करते हैं, उनके पास स्वयं तक पहुंच नहीं है। चूंकि मेरी कक्षा लाइब्रेरी का हिस्सा है, इसलिए यह सुनिश्चित करने का कोई तरीका नहीं है कि लाइब्रेरी का उपयोग करने वाले वर्गों को कमांड-लाइन तर्कों तक पहुंच होगी, भले ही उन्हें मेरी कक्षा का उपयोग करने की आवश्यकता होगी। इसके अलावा, यह समस्या अन्य डिज़ाइनों को बदलने के लिए मजबूर करने के लिए समग्र डिजाइन के लिए पर्याप्त महत्वपूर्ण नहीं है। – Mackenzie

उत्तर

2

आप थ्रेड सूचीबद्ध कर सकते हैं, मुख्य धागा ढूंढ सकते हैं, और स्टैक ट्रेस को क्रॉल कर सकते हैं जब तक कि आप मुख्य रूप से कॉल नहीं पाते हैं, और तर्क खींचते हैं।

अद्यतन एक टिप्पणी बताती है कि यह सब स्वयं ही काम नहीं करेगा, और मुझे लगता है कि टिप्पणी सही है। मैंने स्टैक आत्मनिरीक्षण की क्षमताओं को गलत समझा या मानसिक रूप से JVMTI में मिश्रित किया।

तो, यहां योजना बी है। जेएमएक्स के साथ स्वयं से जुड़ें। वीएम सारांश एमबीन के तर्क हैं।

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

यह सब कहा गया है, क्या आप चाहिए कर System.getProperty फोन और डी का उपयोग करने के अपने गुफा में नीचे बाहर की दुनिया से मानकों को पारित करने के लिए की जरूरत के साथ रहती है।

+2

आप तर्क कैसे खींचेंगे? वे 'StackTraceElement' ऑब्जेक्ट में नहीं हैं। –

-1

आप एक आवरण लिख सकता है CLI लेने के लिए और फिर से प्रारूप यह -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 
} 
बेशक

, आप हमेशा केवल आपके उपयोगकर्ताओं के साथ एक पार्टी/बैच स्क्रिप्ट आह्वान करने के लिए बता सकते हैं उचित -da = true प्रकार तर्क

8

अभिव्यक्ति के बाद वास्तव में आप क्या चाहते हैं:

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

+1

यह कभी-कभी काम करता है, क्योंकि यह ऐसी संपत्ति नहीं है जो उपस्थित होने की गारंटी है। मैं अकेले इस पर भरोसा नहीं करता। आम तौर पर, एक डिजाइन परिप्रेक्ष्य से, कहीं भी मूल्यों को संग्रहित करना बेहतर होता है। – Jochen

संबंधित मुद्दे