java - 使用反射运行 jar 时出现参数问题

标签 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/连接,但中间有一个空格??

知道发生了什么吗?

大卫

最佳答案

也许如果我们看看您的 main 方法,特别是参数的管理方式,我们可以以更好的方式帮助您......

请注意,当您使用命令 java ... -a -c ./config/param.xml 运行主类时,您的 main(String [] args) 方法:

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

将显示:

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

关于java - 使用反射运行 jar 时出现参数问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2193873/

相关文章:

java - 客户端发送的请求在语法上错误

java - 尝试使用 input.nextLine() 用用户输入(字符串)填充数组,但打印输出两次并且第一次不要求输入

java - 如何在 PIE 下使用私有(private)创建者(如 EGLContext)创建对象?

c# - 克隆不同对象属性的最佳方法

.net - 与从非 GUI 线程显示 MessageBox 相关的问题

java - Jenkins/Artifactory-无法找到方法create()

java - 如何通过传递 Object[] 而不是带反射的参数列表来创建类的新实例

在创建窗口句柄之前,无法在控件上调用 VB.NET Invoke,但句柄已创建

c# - 当方法信息仅在运行时已知时优化 MethodInfo.Invoke

java - 从 python 调用 Java 应用程序时无法读取文件