代码之家  ›  专栏  ›  技术社区  ›  frank

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

  •  0
  • frank  · 技术社区  · 9 年前

    newBuilder 接口(它们实际上是protobuf生成的类)。我想将该类作为参数传递给一个表单,该表单返回一个函数,以创建该类的新生成器。

    (defn create-message-builder
      [klass]
      (. klass newBuilder))
    

    我无法动态获取表单,因此它调用 新造船厂 klass .

    我发现一个宏 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未找到匹配字段:类java.lang.class的newBuilder

    1 回复  |  直到 9 年前
        1
  •  4
  •   amalloy    9 年前

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

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