Я хочу загрузить Java-класс с помощью URLClassLoader и вызвать метод main. Код ниже дает ошибку на последней строке, и я не могу понять, как это исправить.Clojure: как вызвать статический метод main из класса Java, загруженного URLClassLoader
(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")
потерпит неудачу.
Спасибо, Павел
Спасибо, это сработало –
Я понимаю, как это сделать это в Java, никаких проблем здесь. Моя проблема с этим подходом заключалась в том, что при вызове метода getMethod мне нужно указать точную подпись для типов параметров. В java это будет String []. Class. Я не мог понять, как это сделать в clojure. –
Прямого представления нет. Я бы, вероятно, пошел (класс (в массив String [])). См. Http://asymmetrical-view.com/2009/07/02/clojure-primitive-arrays.html – DanLebrero