2010-02-03 46 views
0

運行一個罐子當爭吵我嘗試使用與實現getMethod反射運行一個罐子,調用方法,但在傳遞給invoke方法的參數麻煩跑:問題,使用反射

String mainClass = myprog.Run; 
String[] args = new String[2]; 
args[0] = "-a"; 
args[1] = "-c ./config/param.xml" 

ClassLoader classLoader = createClassLoader(getClassPath()); 

// Invoke the method 
setContextClassLoader(classLoader); 
Class<?> theClass = classLoader.loadClass(mainClass); 

theClass.getMethod("main", String[].class).invoke(null, (Object) args); 

和我這個錯誤:

[java] java.lang.reflect.InvocationTargetException 
[java]  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
[java]  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
[java]  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
[java]  at java.lang.reflect.Method.invoke(Method.java:597) 
[java]  at eu.keep.util.JarRunner.run(Unknown Source) 
[java] Caused by: java.lang.RuntimeException: config file 'param.xml' does not exist in folder '/home/user/ ./config' 
[java]  at dioscuri.DioscuriFrame.<init>(Unknown Source) 
[java]  at dioscuri.DioscuriFrame.main(Unknown Source) 
[java]  ... 5 more 

你可以從堆棧跟蹤看到,它試圖從文件夾/ home/user中/ ./config中'訪問該文件「param.xml」。

顯然,如果'/ home/user /'和'./config'之間的空格不存在,那一切都會好的。

我感到困惑的是我已經將參數硬編碼到String []參數中,第二個參數是「-c ./config/param.xml」,它看起來像應用程序運行的目錄,即/ home/user /,與./config/連接,但在兩者之間有一個空格?

任何想法發生了什麼?

大衛

+1

沒有看到'DioscuriFrame'的樣子,我們沒有辦法知道 – skaffman

回答

1

也許如果我們看看你的main方法,尤其是參數的管理方式,我們可以幫助你以更好的方式...

注意,當你與運行主類命令java ... -a -c ./config/param.xml,那麼你必須在你的main(String[] args)方法3個參數:

public static void main(String[] args) { 
    for (String s : args) { 
     System.out.println("-> '" + s + "'"); 
    } 
    ... 

顯示:

-> '-a' 
-> '-c' 
-> './config/param.xml' 
+0

的確如其他答案一樣提示它!愚蠢的我。多謝你們 – dm76

1
String[] args = new String[3]; 
args[0] = "-a"; 
args[1] = "-c"; 
args[2] = "./config/param.xml" 

但請提供導致異常的代碼。

1

-c./config/param.xml需要位於單獨的數組元素中。