Zum Inhalt springen
Anjunar/ DOCS

Annotierte Properties

AnnotationIntrospector baut Properties aus den Feldern und Methoden, die eine bestimmte Annotation tragen. Er versteht Scala-Accessoren ebenso wie JavaBean-Namen.

Auswahl

Die Annotation entscheidet

Nur annotierte Felder und Methoden werden Properties. Zu jeder sucht der Introspektor passenden Getter und Setter: name und name_$eq in Scala, getName, isName und setName in Java.

java
@Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD, ElementType.METHOD}) public @interface Exposed {}
scala
import com.anjunar.scala.universe.introspector.AnnotationIntrospector import scala.annotation.meta.field class Account { @(Exposed @field) var owner: String = "Ada" var internal: String = "hidden" } val model = AnnotationIntrospector.createWithType(classOf[Account], classOf[Exposed]) println(model.properties.map(_.name).mkString(", ")) // owner println(model.findProperty("owner").isWriteable) // true
Namen

Wie ein Member zum Property-Namen wird

Ein Feld behält seinen Namen. Eine annotierte Methode wird der Property zugeordnet, zu der sie gehört.

owner · owner_$eq
Scala-Getter und -Setter → owner.
getOwner · isActive · setOwner
JavaBean-Namen → owner, active, owner.
anything else
Der Methodenname selbst.
Einsatz

Die Grundlage von json-mapper

json-mapper baut sein Modell mit AnnotationIntrospector und @JsonbProperty. Dasselbe Muster passt zu jedem Framework, bei dem Klassen Property für Property zustimmen.

scala
val model = AnnotationIntrospector.create(TypeResolver.resolve(classOf[UserDto]), classOf[JsonbProperty]) model.properties.foreach(property => println(s"${property.name}: ${property.propertyType.name}"))
Ausgabe
name: String age: Integer address: AddressDto