我有一个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$Requires
和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。因此,这可能是一个使用错误 - 但我应该做些什么呢?
答案 0 :(得分:2)
除java.lang
中的类(如Deprecated
)外,所有类名必须在gen-class
声明中完全限定。所以,你的代码应该是:
^{org.basex.query.QueryModule$Deterministic {},
org.basex.query.QueryModule$Requires org.basex.query.QueryModule$Permission/NONE}
请注意,相同的限制不适用于deftype
,defprotocol
或defrecord
表单中的注释元数据。
答案 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]
])