2

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

(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$Requiresand QueryModule$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 开始的。因此,这可能是一个使用错误——但我应该做些什么不同的事情呢?

4

2 回答 2

2

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

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

请注意,相同的限制不适用于 on/in 、 或 forms 上的注释deftypedefprotocol数据defrecord

于 2012-04-19T15:32:12.723 回答
0

gen-class定义移出ns声明允许imports 应用:

(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]
  ])
于 2012-04-19T16:24:23.910 回答