使用反射运行jar时参数的问题

时间:2010-02-03 17:21:10

标签: java reflection invoke getmethod

我尝试使用getMethod和invoke方法使用反射来运行jar,但是在传递给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 [] args中,第二个是“-c ./config/param.xml”,它看起来像应用程序运行的目录,即/ home / user /,与./config/连接,但中间有空格?

知道发生了什么事吗?

大卫

3 个答案:

答案 0 :(得分:1)

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

但请提供导致例外的代码。

答案 1 :(得分: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'

答案 2 :(得分:1)

-c./config/param.xml需要位于不同的数组元素中。