Zum Inhalt springen
Anjunar/ DOCS

Annotationen

Jedes Element des Modells ist Annotated. Der Unterschied zwischen annotations und declaredAnnotations ist, wo die Suche endet, und scala-universe sucht weiter als einfache Reflection.

Suche

findAnnotation

findAnnotation liefert die Annotation genau dieses Typs oder null. findDeclaredAnnotation schaut nur auf das Element selbst.

scala
val column = TypeResolver.resolve(classOf[Customer]).findField("nickName") val schemaId = column.findAnnotation(classOf[SchemaId]) if schemaId != null then println(schemaId.value()) // f34e45b6
Vererbung

Wohin Annotationen wandern

annotations folgt der Hierarchie für jede Art von Element. Das ist unabhängig von Javas @Inherited, das nur für Klassenannotationen von Oberklassen gilt.

ResolvedClass
Die eigenen plus die jeder Oberklasse und jedes Interfaces.
ResolvedMethod
Die eigenen plus die jeder Methode, die sie überschreibt.
ResolvedField
Die eigenen plus die der Felder, die es verdeckt.
ResolvedParameter
Die eigenen plus die desselben Parameters in überschriebenen Methoden.
AbstractProperty
Die von Feld, Getter und Setter zusammen.
Scala

Welche Annotationen zur Laufzeit existieren

Nur Java-Annotationen mit RetentionPolicy.RUNTIME landen so in der Klassendatei, dass Reflection sie lesen kann. Scala-Annotationen, die StaticAnnotation erweitern, sind hier unsichtbar.

scala
import scala.annotation.meta.{field, getter, setter} class Account { @(Exposed @field) var owner: String = "Ada" // on the field @(Exposed @getter) var email: String = "" // on the method email() @Exposed var phone: String = "" // Scala's default target for a var: the field }
Meta-Annotationen wählen das Ziel

Eine Scala-var oder -val ist ein Feld plus Accessoren. @field, @getter und @setter sagen, welcher Teil die Annotation trägt; Properties finden sie so oder so, weil sie Feld und Accessoren zusammenführen.