我有这个用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会在这里丢失注释?
答案 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)