Clojure:将注释附加到AOT编译的方法

时间:2012-04-06 20:47:12

标签: clojure

我有一个BaseX Java interface模块,我在Clojure中写道。该接口提供了许多注释,可用于确定如何调用和优化方法;但是,我无法将这些实际附加到生成的类:

(ns net.dyfis.svnkit_wrapper.SvnWrapper
  (:import (org.basex.query QueryModule
                            QueryModule$Requires
                            QueryModule$Permission
                            QueryModule$Deterministic))
  (:gen-class
    :main false
    :extends org.basex.query.QueryModule
    :methods [
      ^{:static true}
      [^{QueryModule$Requires QueryModule$Permission/NONE,
         Deprecated {}}
       cat [java.lang.String] java.lang.String]

      ^{:static true}
      [^{QueryModule$Deterministic {},
         QueryModule$Requires QueryModule$Permission/NONE}
       catRev [java.lang.String int] java.lang.String]]))

但是,只有Deprecated注释被附加 - QueryModule$RequiresQueryModule$Deterministic注释被静默丢弃:

>>> cat
public static java.lang.String net.dyfis.svnkit_wrapper.SvnWrapper.cat(java.lang.String)
>>> cat.getAnnotations()
array(java.lang.annotation.Annotation,[@java.lang.Deprecated()])

这是在Clojure 1.4.0-beta6中发生的,而AOT编译方法中的注释支持应该来自Clojure 1.2。因此,这可能是一个使用错误 - 但我应该做些什么呢?

2 个答案:

答案 0 :(得分:2)

java.lang中的类(如Deprecated)外,所有类名必须在gen-class声明中完全限定。所以,你的代码应该是:

^{org.basex.query.QueryModule$Deterministic {},
  org.basex.query.QueryModule$Requires org.basex.query.QueryModule$Permission/NONE}

请注意,相同的限制不适用于deftypedefprotocoldefrecord表单中的注释元数据。

答案 1 :(得分:0)

gen-class定义移出ns声明,允许import适用:

(ns net.dyfis.svnkit_wrapper.SvnWrapper
  (:import (org.basex.query QueryModule
                            QueryModule$Requires
                            QueryModule$Permission
                            QueryModule$Deterministic)))

(gen-class
  :name com.indeed.svnkit_wrapper.SvnWrapper
  :main false
  :extends org.basex.query.QueryModule
  :methods [
    ^{:static true}
    [^{QueryModule$Requires QueryModule$Permission/NONE,
       Deprecated {}}
     cat [java.lang.String] java.lang.String]

    ^{:static true}
    [^{QueryModule$Deterministic {},
       QueryModule$Requires QueryModule$Permission/NONE}
     catRev [java.lang.String long] java.lang.String]
  ])