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

时间:2015-02-11 01:23:12

标签: 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 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")

会失败。

谢谢你, 帕维尔

2 个答案:

答案 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])))