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

Clojure: Attaching annotations to AOT-compiled methods

我有一个用Clojure编写的BaseX Java接口模块。该接口提供了许多注释,可用于确定如何调用和优化方法。但是,我很难将它们实际附加到生成的类上:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
(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注释:

1
2
3
4
>>> 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中发生的,而Clojure 1.2应该支持AOT编译方法中的注释。因此,这大概是使用错误-但是我应该做些什么?


除了java.lang中的类(如Deprecated),所有类名都必须在gen-class声明中完全限定。因此,您的代码应为:

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

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


gen-class定义移出ns声明使import可以应用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
(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]
  ])