Clojure:如何从URLClassLoader加载的Java类调用静态方法main
我想使用URLClassLoader加载Java类并调用main方法。下面的代码在最后一行给出了一个错误,我不知道如何修复它 (def classloader (URLClassLoader. (into-array files))) (def classname "example.Test") (def clazz (.. classloader (loadClass classname))) ; I assume not the most effective way to get method "main" ; additional feedback appreciated (def method (first (filter #(= (. % getName) "main") (. clazz getMethods)))) (def args (make-array String 1)) ; specify single command line argument for method main(String[]args) (aset args 0 "my-file") ; attempt to invoke static method using Java reflection API fails. (. method invoke nil args) (def类装入器(URLClassLoader.(放入数组文件))) (def classname“example.Test”) (def clazz(…classloader(loadClass classname))) ; 我认为这不是获取方法“main”的最有效方法 ; 额外的反馈表示感谢 (def方法(第一个(filter#(=(.%getName)“main”)(.clazz getMethods))) (def参数(生成数组字符串1)) ; 为方法main指定单个命令行参数(字符串[]args) (aset参数0“我的文件”) ; 尝试使用Java反射API调用静态方法失败。 (.方法调用nil args) 线程“main”java.lang.IllegalArgumentException中的异常: 参数类型不匹配,正在编译: 请注意,该类在默认类加载器中不可用,因此 (example.Test/main "myfile") (example.Test/main“myfile”) 这将失败 谢谢,,Clojure:如何从URLClassLoader加载的Java类调用静态方法main,clojure,clojure-java-interop,Clojure,Clojure Java Interop,我想使用URLClassLoader加载Java类并调用main方法。下面的代码在最后一行给出了一个错误,我不知道如何修复它 (def classloader (URLClassLoader. (into-array files))) (def classname "example.Test") (def clazz (.. classloader (loadClass classname))) ; I assume not the most effective way to get met
Pavel您将invoke的签名与main方法的签名混淆了 “main”的签名是(字符串[]args1) “invoke”的签名是(objectobj,Object…args2) args2应该是一个数组,在main方法中每个参数有一个项,因此它应该是一个包含1个元素的数组,元素是字符串[]。因此:
(def invoke-args (into-array Object [args]))
(. method invoke nil invoke-args)
关于查找“main”的更简单方法,请看下面我总结了讨论的结果。(感谢丹尼的帮助)
我知道如何用Java实现,这里没有问题。这种方法的问题是,在调用getMethod时,我需要为参数类型指定确切的签名。在java中,它将是String[].class。我不知道如何在clojure中实现它。没有直接的表示。我可能会选择(类(进入数组字符串[]))。请参阅下面的代码:(.clazzgetmethod“main”(进入数组类[(类(进入数组字符串[]))]))谢谢。
(def invoke-args (into-array Object [args]))
(. method invoke nil invoke-args)
(let
[classname "example.Test"
clazz (.. classloader (loadClass classname))
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])))