为什么Scala不在此处保留字段注释?

时间:2018-04-30 22:22:57

标签: java scala annotations

我有这个用Java编写的注释,因为Scala没有提供使用运行时保留策略定义注释的方法。

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface When {
    String event();
}

我有这两个班。一个在Java。

public class TestJavaClass {
    @When(event = "something")
    public String someField;
}

斯卡拉的另一个人。

case class TestScalaClass(@When(event = "something") someField: String)

Java类在反映时会按预期给出注释。这是一个Scala REPL会话,展示了这一点。

scala> classOf[TestJavaClass].getDeclaredField("someField").getAnnotations
res1: Array[java.lang.annotation.Annotation] = Array(@utils.When(event=something))
然而,

Scala类虽然看起来在这方面应该是相同的,但不是。

scala> classOf[TestScalaClass].getDeclaredField("someField").getAnnotations
res2: Array[java.lang.annotation.Annotation] = Array()

为什么Scala会在这里丢失注释?

1 个答案:

答案 0 :(得分:1)

这似乎有效:

case class TestScalaClass(@(When @annotation.meta.field)(event = "something") someField: String)

对于工件,元注释指示它放置注释的位置。

文档建议使用别名:

import annotation.meta._

object Helper {
  type Whenfield = When @field
}
import Helper._

case class TestScalaClass(@Whenfield(event = "something") someField: String)