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 reflexión verificación nullable types
  • Obteniendo la class actual
  • ¿Hay alguna manera de identificar una class de datos Kotlin de una class regular de Kotlin?
  • Kotlin: ¿Cómo se accede a los methods get y setValue de un delegado?
  • Crear una nueva instancia de una KClass
  • Obtén la function por nombre dinámicamente en Kotlin
  • Reflexión de Kotlin: compruebe si la propiedad tiene tipo
  • ¿Cómo puedo get una reference a Kotlin KClass por nombre cuando no se ejecuta en la JVM?
  • ¿Puedo get una KFunction de una variable del tipo de function en Kotlin?
  • Quiero detectar si una class JVM es una class Kotlin o no
  • ¿Cómo get los nombres de los parameters a través de la reflexión en kotlin?