Kotlin obtiene la anotación de campo siempre vacía

Tengo la siguiente anotación de Kotlin

@Target(AnnotationTarget.FIELD, AnnotationTarget.PROPERTY_GETTER) @Retention(AnnotationRetention.RUNTIME) annotation class Field(val value: String) 

Y el siguiente código de testing

 class TestObject(@field:Field("id") val id: Long) { @field:Field("string") val string = "Hello world" @get:Field("prop") val prop get() = string } class AnnotationTest { @Test fun test() { val obj = TestObject(200L) for (member in obj::class.declanetworkingMemberProperties) { if (member.findAnnotation<Field>() != null) { println(member) } println(member) println(member.annotations) } println("#########") for(member in obj.javaClass.declanetworkingFields) { println(member) println(member.annotations) } } } 

Imprimirá el siguiente resultado:

 val TestObject.id: kotlin.Long [] val TestObject.prop: kotlin.String [] val TestObject.string: kotlin.String [] ######### private final java.lang.String TestObject.string [Ljava.lang.annotation.Annotation;@33d512c1 private final long TestObject.id [Ljava.lang.annotation.Annotation;@515c6049 

¿Por qué no puedo ver la Anotación con la reflexión de Kotlin? Necesidad de averiguar si la anotación dada está presente en campos y captadores de properties.

Su anotación para prop está orientada a getter, en lugar de llamar a findAnnotation en la propiedad, debe llamarlo en el getter de la propiedad.

 for (member in obj::class.declanetworkingMemberProperties) { if (member.getter.findAnnotation<Field>() != null) { //add .getter println(member) } println(member) println(member.getter.annotations) //add .getter } 

Su anotación para id y string es el campo de orientación, por lo que lo que hizo en el segundo ciclo es correcto. Dado que member.annotations devuelve Annotation[] , debe cambiarlo a List antes de imprimirlo.

 for(member in obj.javaClass.declanetworkingFields) { println(member) println(member.annotations.toList()) //Add .toList() } 

Salida:

 val TestObject.id: kotlin.Long [] val TestObject.prop: kotlin.String val TestObject.prop: kotlin.String [@Field(value=[prop])] val TestObject.string: kotlin.String [] ######### private final java.lang.String TestObject.string [@Field(value=[string])] private final long TestObject.id [@Field(value=[id])] 
  • Kotlin, cómo recuperar el valor del campo a través de la reflexión
  • Kotlin enlazó la incoinheritance de las references invocables
  • ¿Cómo get una KClass de Array?
  • ¿El comstackdor de Kotlin siempre conserva los nombres de los parameters en bytecode?
  • Implementando una interfaz de kotlin en java
  • Kotlin language obtiene class en time de ejecución
  • ¿Cómo puedo get el nombre de una propiedad de Kotlin?
  • ¿Cómo establecer el valor de propiedad delegada por reflexión en kotlin?
  • Usar reflexión para pasar y modificar una primitiva sin usar matriz
  • Quiero detectar si una class JVM es una class Kotlin o no
  • ¿Cómo obtengo una KProperty1 de una KProperty0?