注释未复制到 getter 和 setter

Annotation not getting copied to getter and setter

所以,我有这个注释 class

@Target(AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER, AnnotationTarget.PROPERTY)
@Retention(AnnotationRetention.RUNTIME)
annotation class MyTestAnnotation(val text: String)

我就是这样用的

interface MyTestInterface {

    @MyTestAnnotation("temp")
    var tempString: String
}

这就是我使用反射实例化界面的方式。

fun <T> with(myInterface: Class<T>): T {
    return Proxy.newProxyInstance(
        myInterface.classLoader,
        arrayOf<Class<*>>(myInterface),
        invocationHandler
    ) as T
}

private val invocationHandler = InvocationHandler { _, method, args ->
    Log.e("Called method:", method.name) // setTempString
    Log.e("declaredAnnotations", method.declaredAnnotations.size.toString()) // 0
    Log.e("annotations", method.annotations.size.toString()) // 0
    Log.e("args", args.size.toString()) // 1
}

我是这样称呼它的

val myInterface = with(MyTestInterface::class.java)
myInterface.tempString = "123"

我无法访问注释 class 的成员 text 因为在我的 invocationHandler 中我没有得到注释(因为你可以看到两个数组长度为零)。

我的问题:有什么方法可以将注释复制到 getter 和 setter 以便我可以访问我放在注释中的数据?

您可以指定注释的使用位置目标。例如,如果你想同时注释 setter 和 getter 你可以这样做:

@set:YourAnnotation
@get:YourAnnotation
val aProperty: AType

官方文档:https://kotlinlang.org/docs/annotations.html#annotation-use-site-targets