¿Cuál es la forma legítima de get annotations de una propiedad pura de Kotlin a través de la reflexión, siempre faltan?

Estoy tratando de get annotations de la class de datos Kotlin

package some.meaningless.package.name import kotlin.reflect.full.memberProperties annotation class MyAnnotation() @MyAnnotation data class TestDto(@MyAnnotation val answer: Int = 42) fun main(args: Array<String>) { TestDto::class.memberProperties.forEach { p -> println(p.annotations) } println(TestDto::class.annotations) } 

Necesito procesar la anotación de class para hacer una serialization de nombre personalizada de GSON, sin embargo, no importa cómo declaro la class de anotación, nunca se detecta

El progtwig siempre produce

 [] [@some.meaningless.package.name.MyAnnotation()] 

lo que significa que solo las annotations de nivel de class están presentes

Solutions Collecting From Web of "¿Cuál es la forma legítima de get annotations de una propiedad pura de Kotlin a través de la reflexión, siempre faltan?"

Como reference de Kotlin, como a continuación:

Si no especifica un objective de sitio de uso , el objective se elige de acuerdo con la anotación @Target de la anotación que se utiliza. Si hay múltiples objectives aplicables, el primer objective aplicable de lo siguiente: param > property > field .

Para hacer anotar la anotación en una property , debe usar el destino del sitio , por ejemplo:

 @MyAnnotation data class TestDto(@property:MyAnnotation val answer: Int = 42) 

Sin embargo, las annotations con el destino de la property en Kotlin no son visibles para Java, por lo que debe duplicar la anotación, por ejemplo:

 @MyAnnotation // v--- used for property v--- used for params in Java data class TestDto(@property:MyAnnotation @MyAnnotation val answer: Int = 42) 

De acuerdo, parece que el culpable fue que las annotations de Kotlin tienen por defecto @Target (AnnotationTarget.CLASS) que no está suficientemente acentuado en la documentation.

Después de agregar @Target a la class de anotación ahora funciona correctamente

 @Target(AnnotationTarget.CLASS, AnnotationTarget.PROPERTY) annotation class MyAnnotation() 

Ahora se imprime

 [@some.meaningless.package.name.MyAnnotation()] [@some.meaningless.package.name.MyAnnotation()] 

Como un efecto secundario, obligará al comstackdor a verificar que la anotación se aplique como se requiere, en la versión actual de Kotlin, si el @Target explícito no está presente, solo se mantienen las annotations de nivel de class pero no se realizan comprobaciones de validez.