Clojure 调用静态 Java 匿名方法 class
Clojure call to static Java method of anonymous class
我有一组 Java classes,它们都实现了 newBuilder
接口(它们实际上是 protobuf 生成的 classes)。我想将 class 作为参数传递给 returns 一个函数来为 class.
创建一个新的构建器
(defn create-message-builder
[klass]
(. klass newBuilder))
我无法动态获取表单,因此它会调用 klass
上的 newBuilder
静态方法。
我在 another SO post 上找到了一个宏并进行了一些修改以支持将其注入我的源代码:
(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 No matching field found: newBuilder for class java.lang.Class
你会在 Java 中做同样的事情:使用反射询问 Class 对象它有什么方法,找到正确的名称之一,然后不带参数调用它。
(defn class->builder [c]
(let [m (.getDeclaredMethod c "newBuilder" (into-array Class []))]
(.invoke m nil (into-array Object []))))
我有一组 Java classes,它们都实现了 newBuilder
接口(它们实际上是 protobuf 生成的 classes)。我想将 class 作为参数传递给 returns 一个函数来为 class.
(defn create-message-builder
[klass]
(. klass newBuilder))
我无法动态获取表单,因此它会调用 klass
上的 newBuilder
静态方法。
我在 another SO post 上找到了一个宏并进行了一些修改以支持将其注入我的源代码:
(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 No matching field found: newBuilder for class java.lang.Class
你会在 Java 中做同样的事情:使用反射询问 Class 对象它有什么方法,找到正确的名称之一,然后不带参数调用它。
(defn class->builder [c]
(let [m (.getDeclaredMethod c "newBuilder" (into-array Class []))]
(.invoke m nil (into-array Object []))))