Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure:如何从URLClassLoader加载的Java类调用静态方法main_Clojure_Clojure Java Interop - Fatal编程技术网

Clojure:如何从URLClassLoader加载的Java类调用静态方法main

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

我想使用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”) 这将失败

谢谢,,
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])))