Java Scala类字段上的getAnnotations
我正在尝试将Java库(JOhm)与Scala一起使用,并注意到当库尝试使用类似于Java Scala类字段上的getAnnotations,java,scala,reflection,Java,Scala,Reflection,我正在尝试将Java库(JOhm)与Scala一起使用,并注意到当库尝试使用类似于field.isAnnotationPresent(Id.class)的内容读取Scala类字段上的注释时,它失败了 注释是用Java定义的,带有: @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface Id { } 因此,它们应该在运行时可用。但是,如果我尝试: scala> import red
field.isAnnotationPresent(Id.class)
的内容读取Scala类字段上的注释时,它失败了
注释是用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用户…),但我仍然无法访问注释。我做错了什么?多亏了“soc”,才有了一个明确的答案:“默认情况下,(val-、var-或plain)构造函数参数上的注释最终会出现在参数上…”
所讨论的注释是为具有运行时保留的字段元素定义的,同时将其应用于scala构造函数参数(参数)
最近,我尝试在scala构造函数“var”参数上使用JAXB字段级@XmlElement注释时遇到了同样的情况——对我来说也不起作用
通过在类中定义一个不同的字段,并从构造函数的参数列表中初始化它(消除'val/var'关键字),我解决了JAXB问题。在您的情况下,这可能看起来像:
class myClass(_id: java.lang.Long) {
@Id var id = _id
}
参考文献提出了另外两个备选方案:
class myClass(_id: java.lang.Long) {
@Id var id = _id
}
参考文献提出了另外两个备选方案:
谢谢你的回答。实际上,我在REPL中重现了我在代码中遇到的问题(我曾尝试直接从Scala程序中记录注释,但无法做到)。因此,我在这里发布的示例可能不起作用,因为它在REPL中,但是我的代码由于另一个原因失败了。你完全正确。定义字段明确地解决了这个问题。救了我一个晚上,谢谢!谢谢你的回答。实际上,我在REPL中重现了我在代码中遇到的问题(我曾尝试直接从Scala程序中记录注释,但无法做到)。因此,我在这里发布的示例可能不起作用,因为它在REPL中,但是我的代码由于另一个原因失败了。你完全正确。定义字段明确地解决了这个问题。救了我一个晚上,谢谢!有元注释告诉Scala将注释准确放置在何处:有元注释告诉Scala将注释准确放置在何处: