Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Scala类字段上的getAnnotations_Java_Scala_Reflection - Fatal编程技术网

Java Scala类字段上的getAnnotations

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

我正在尝试将Java库(JOhm)与Scala一起使用,并注意到当库尝试使用类似于
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
}
参考文献提出了另外两个备选方案:

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

  • 使用已重命名为的将注释重新分类(重新定位)到基础字段(或其他选项)

  • 多亏了'soc'for,才有了一个明确的答案:“默认情况下,(val-、var-或plain)构造函数参数上的注释最终出现在参数上……”

    所讨论的注释是为具有运行时保留的字段元素定义的,同时将其应用于scala构造函数参数(参数)

    最近,我尝试在scala构造函数“var”参数上使用JAXB字段级@XmlElement注释时遇到了同样的情况——对我来说也不起作用

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

    class myClass(_id: java.lang.Long) {
        @Id var id = _id
    }
    
    参考文献提出了另外两个备选方案:

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

  • 使用已重命名为的将注释重新分类(重新定位)到基础字段(或其他选项)


  • 谢谢你的回答。实际上,我在REPL中重现了我在代码中遇到的问题(我曾尝试直接从Scala程序中记录注释,但无法做到)。因此,我在这里发布的示例可能不起作用,因为它在REPL中,但是我的代码由于另一个原因失败了。你完全正确。定义字段明确地解决了这个问题。救了我一个晚上,谢谢!谢谢你的回答。实际上,我在REPL中重现了我在代码中遇到的问题(我曾尝试直接从Scala程序中记录注释,但无法做到)。因此,我在这里发布的示例可能不起作用,因为它在REPL中,但是我的代码由于另一个原因失败了。你完全正确。定义字段明确地解决了这个问题。救了我一个晚上,谢谢!有元注释告诉Scala将注释准确放置在何处:有元注释告诉Scala将注释准确放置在何处: