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