2012-04-06 20 views
2

我有一个模块,用于我在Clojure中编写的BaseXJava interface。该界面提供了许多注释,可用于确定如何调用和优化方法。不过,我遇到了麻烦,这些实际上附加到生成的类:Clojure:将注释附加到AOT编译的方法

(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]])) 

然而,只有过时的注释被连接 - 在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

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

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

注意的是,同样的限制不会deftypedefprotocol,或defrecord形式适用于注解元数据上/。

0

移动gen-class定义出ns声明允许import s到适用于:

(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] 
    ])