我想使用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)
Exception in thread "main" java.lang.IllegalArgumentException: argument type mismatch, compiling:
请注意,默认的类加载器中没有其他类,所以
(example.Test/main "myfile")
会失败。
谢谢你, 帕维尔
答案 0 :(得分:1)
你将invoke的签名与main方法的签名混淆。
" main"的签名是(String [] args1) #34;签名"调用"是(Object obj,Object ... args2)
args2应该是一个数组,在main方法中每个param有一个项目,因此它应该是一个包含1个元素的数组,该元素是String []。所以:
(def invoke-args (into-array Object [args]))
(. method invoke nil invoke-args)
关于更简单的查找方式" main"看看http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#getMethod(java.lang.String,%20java.lang.Class...)
答案 1 :(得分:0)
我总结了下面讨论的结果。 (感谢dAni的帮助)。
(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])))