2

我想使用 URLClassLoader 加载 Java 类并调用 main 方法。下面的代码在最后一行给出了一个错误,我不知道如何修复它。

(def classloader (URLClassLoader. (into-array files)))

(定义类名“example.Test”)
(def clazz (.. classloader (loadClass classname)))

; 我认为不是获取方法“main”的最有效方法
; 额外的反馈表示赞赏
(def 方法 (first (filter #(= (. % getName) "main") (.clazz getMethods))))

(def args (make-array String 1))
; 为方法 main(String[]args) 指定单个命令行参数
(aset args 0 "我的文件")

; 尝试使用 Java 反射 API 调用静态方法失败。
(.方法调用 nil args)

线程“主”java.lang.IllegalArgumentException 中的异常:
参数类型不匹配,编译:

请注意,该类在默认类加载器中不可用,因此

 (example.Test/main“我的文件”)

会失败。

谢谢你,帕维尔

4

2 回答 2

1

您将调用的签名与 main 方法的签名混淆了。

"main" 的签名是 (String[] args1) "invoke" 的签名是 (Object obj, Object... args2)

args2 应该是一个数组,main 方法中的每个参数都有一个项目,因此它应该是一个包含 1 个元素的数组,元素是 String[]。所以:

(def invoke-args (into-array Object [args]))
(. method invoke nil invoke-args)

关于查找“主要”的更简单方法,请查看http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#getMethod(java.lang.String,%20java.lang。班级...)

于 2015-02-11T12:51:09.087 回答
0

我总结了下面讨论的结果。(感谢 dAni 的帮助)。

    (让
      [类名“example.Test”
       clazz (.. 类加载器 (loadClass 类名))

method (. clazz getMethod "main" (into-array Class [(class (into-array String []))])) args (make-array String 1)] (aset args 0 "my-file") (. method invoke nil (into-array Object [args])))

于 2015-02-12T20:31:43.977 回答