Clojure调用匿名类的静态Java方法

Clojure调用匿名类的静态Java方法,clojure,clojure-java-interop,Clojure,Clojure Java Interop,我有一组Java类,它们都实现了newBuilder接口(它们实际上是protobuf生成的类)。我想将该类作为参数传递给一个窗体,该窗体返回一个函数,以便为该类创建一个新的生成器 (defn create-message-builder [klass] (. klass newBuilder)) 我无法动态获取表单,因此它在klass上调用newBuilder静态方法 我在上找到了一个宏,并进行了一些修改,以支持将其注入源代码: (defmacro jcall [obj &

我有一组Java类,它们都实现了
newBuilder
接口(它们实际上是protobuf生成的类)。我想将该类作为参数传递给一个窗体,该窗体返回一个函数,以便为该类创建一个新的生成器

(defn create-message-builder
  [klass]
  (. klass newBuilder))
我无法动态获取表单,因此它在
klass
上调用
newBuilder
静态方法

我在上找到了一个宏,并进行了一些修改,以支持将其注入源代码:

(defmacro jcall [obj & args]
  `(let [ref (if (and (symbol? ~obj) 
                     (instance? Class (eval ~obj)))
          (eval ~obj)
          ~obj) ]
  (. ref# ~@args)))
当我尝试调用此宏时:

repl> (jcall Contact newBuilder)
#object[com.skroot.Contact$Builder 0x5622de90 ""]
我得到一个错误:

IllegalArgumentException未找到匹配字段:类java.lang.class的newBuilder


在Java中也会做同样的事情:使用反射询问类对象它有什么方法,找到一个正确的名称,然后不带参数地调用它

(defn class->builder [c]
  (let [m (.getDeclaredMethod c "newBuilder" (into-array Class []))]
    (.invoke m nil (into-array Object []))))

在Java中也会做同样的事情:使用反射询问类对象它有什么方法,找到一个正确的名称,然后不带参数地调用它

(defn class->builder [c]
  (let [m (.getDeclaredMethod c "newBuilder" (into-array Class []))]
    (.invoke m nil (into-array Object []))))

而且它根本不是一个匿名类。在编译时你不知道它的名字,因为你在运行时被传递了一个类对象,而且它根本不是一个匿名类。您只是在编译时不知道它的名称,因为您在运行时被传递了一个类对象。