2012-04-06 67 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] 
    ])