2

我正在尝试将 Java 库 (JOhm) 与 Scala 一起使用,并注意到当 lib 尝试使用类似field.isAnnotationPresent(Id.class).

注释在 Java 中定义为:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Id {

}

所以它们应该在运行时可用。但是,如果我尝试:

scala> import redis.clients.johm._
import redis.clients.johm._

scala> class myClass(@Id var id: java.lang.Long)
defined class myClass

scala> new myClass(id = null)
res0: myClass = myClass@5157cfbc

scala> res0.getClass.getDeclaredFields
res1: Array[java.lang.reflect.Field] = Array(private java.lang.Long myClass.id)

scala> res0.getClass.getDeclaredFields.map(_.getAnnotations)
res2: Array[Array[java.lang.annotation.Annotation]] = Array(Array())

然后我设法获取了这些字段(感谢 StackOverflow 用户……),但我仍然无法访问注释。我做错什么了?

4

1 回答 1

4

感谢 'soc' 提供的参考,有一个明确的答案:“默认情况下,(val-,var-或plain)构造函数参数上的注释最终在参数上......”。

有问题的注释是为具有运行时保留的 FIELD 元素定义的,同时它被应用于 scala 构造函数参数 (PARAMETER)。

我最近遇到了同样的情况,试图在 scala 构造函数“var”参数上使用 JAXB FIELD 级别的 @XmlElement 注释 - 也不适用于我。

我通过在类中定义一个不同的字段并从构造函数的参数列表中对其进行初始化(消除了“val/var”关键字)解决了我的 JAXB 问题。在您的情况下,可能看起来像:

class myClass(_id: java.lang.Long) {
    @Id var id = _id
}

该参考文献提出了另外两种选择:

  1. 将注释的元素类型更改(添加)为(包括)参数;这只有在来源可用的情况下才可行。

  2. 使用2.9.2 中的目标包(已重命名为 2.10 的元包),将注释重新分类(重新定位)到基础字段(或其他选项)。

于 2012-08-07T20:52:28.830 回答