2011-01-22 14 views
8

Tôi biết rằng tôi có thể nhận được các đối số dòng lệnh trong phương thức "chính", nhưng tôi cần có thể nhận được chúng gián tiếp.Java có tương đương với môi trường của C#.GetCommandLineArgs() không?

Cảm ơn sự giúp đỡ của bạn.

+2

bạn có thể muốn suy nghĩ lại thiết kế của bạn nếu bạn phải làm một cái gì đó như thế này. – Mike

+2

Tôi nghĩ rằng câu trả lời là bạn không thể. –

+0

@Mike Lớp cần các đối số cần có quyền truy cập vào các đối số dòng lệnh đúng, ngay cả khi các đối tượng khởi tạo nó không tự có quyền truy cập vào chúng. Vì lớp của tôi là một phần của một thư viện, nên không có cách nào để đảm bảo rằng các lớp sử dụng thư viện sẽ có quyền truy cập vào các đối số dòng lệnh, mặc dù chúng sẽ cần sử dụng lớp của tôi. Ngoài ra, vấn đề này không đủ quan trọng để thiết kế tổng thể buộc các lớp khác thay đổi thiết kế của chúng. – Mackenzie

Trả lời

2

Bạn có thể liệt kê các chủ đề, tìm chuỗi chính và thu thập thông tin theo dõi ngăn xếp cho đến khi bạn tìm thấy cuộc gọi đến chính và kéo ra khỏi arg.

cập nhật một nhận xét chỉ ra rằng điều này sẽ không hoạt động một mình và tôi cho rằng nhận xét là chính xác. Tôi đã xác định sai các khả năng chồng chéo nội tâm hoặc trộn lẫn tinh thần trong JVMTI.

Vì vậy, đây là kế hoạch B. Kết nối với chính mình bằng JMX. Bản tóm tắt VM MBean có các arg.

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

Tất cả điều này đã được nói, những gì bạn nên làm là gọi System.getProperty và sống với nhu cầu sử dụng -D để vượt qua các thông số từ thế giới bên ngoài xuống hang động của bạn.

+2

Bạn sẽ rút ra các đối số như thế nào? Chúng không nằm trong đối tượng 'StackTraceElement'. –

-1

Bạn có thể viết một wrapper để có những cli và tái định dạng nó để sử dụng -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 
} 

Tất nhiên, bạn có thể luôn luôn chỉ cho bạn biết người dùng để gọi một kịch bản bash/mẻ với -DA đúng = true kiểu lập luận

8

Tiếp theo biểu thức là chính xác những gì bạn muốn:

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

+1

Điều này chỉ hoạt động đôi khi, vì đây không phải là tài sản được đảm bảo có mặt. Tôi không dựa vào điều này một mình. Nói chung, từ quan điểm thiết kế, lưu trữ các giá trị ở đâu đó tốt hơn. – Jochen

Các vấn đề liên quan