2011-01-22 21 views
8

"main"メソッドでコマンドライン引数を取得できることは知っていますが、間接的にを取得する必要があります。JavaにはC#のEnvironment.GetCommandLineArgs()と同等の機能がありますか?

ありがとうございました。

+2

あなたがあれば、あなたのデザインを再考することをお勧めしますこのようなことをしなければならない。 – Mike

+2

答えはあなたができないと思います。 –

+0

@Mike引数を必要とするクラスは、それをインスタンス化するオブジェクト自身がそれらにアクセスできなくても、真のコマンドライン引数にアクセスする必要があります。私のクラスはライブラリの一部であるため、ライブラリを使用するクラスは、クラスを使用する必要があるにもかかわらず、コマンドライン引数にアクセスできるようにする方法はありません。さらに、この問題は、他のクラスにデザインを変更させるためには、全体的なデザインにはあまり重要ではありません。 – Mackenzie

答えて

2

mainへの呼び出しが見つかるまで、スレッドをリストし、メインスレッドを見つけて、スタックトレースをクロールして、argsを引き出すことができます。

更新コメントは、これだけではすべて機能しないと指摘しています。コメントが正しいと思います。私はスタックイントロスペクションの能力を忘れてしまったのですが、JVMTIで精神的に混在していました。

したがって、計画Bです。JMXで自分自身に接続します。 VMサマリーMBeanにはargsがあります。

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

このすべてが言われた、何やるべきことはSystem.getPropertyを呼び出し、ダウンあなたの洞窟に外の世界からパラメータを渡すために-Dを使用する必要と一緒に住んでいます。あなたは、それはもちろん-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 
} 

を使用するには、CLIを取るためのラッパーと再フォーマットを書くことができ

+2

あなたはどのように議論を引き出すだろうか?それらは 'StackTraceElement'オブジェクトにありません。 –

-1

、あなたは常にだけではbash /バッチスクリプトを呼び出すためにあなたのユーザーを言うことができます発現に続いて、適切な-DA =真の型引数

8

は正確に何をしたいです:

はSystem.getProperty(「sun.java.command」)

+1

これは存在することが保証されているプロパティではないため、これは時々のみ動作します。私はこれだけに頼るつもりはない。一般的に、設計の観点からは、値をどこかに格納する方が良いです。 – Jochen

関連する問題