0
私はすべてnewBuilder
インターフェイスを実装する一連のJavaクラスを持っています(これらは実際に生成されるクラスのプロトタイプです)。私はそのクラスのための新しいビルダーを作成する関数を返すフォームにパラメータとしてクラスを渡したいと思います。Clojureは静的な匿名クラスのJavaメソッドを呼び出します
(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# [email protected])))
私はこのマクロを呼び出そう:
repl> (jcall Contact newBuilder)
#object[com.skroot.Contact$Builder 0x5622de90 ""]
私はエラーを取得する:
私は another SO postにマクロを発見し、私の元に注入サポートするためにいくつかの変更をしましたIllegalArgumentException No matching field found: newBuilder for class java.lang.Class
また、匿名のクラスでもありません。実行時にClassオブジェクトを渡すので、コンパイル時にその名前が分かりません。 – amalloy