我有这个注释类
@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"
我无法访问注释类的成员text
,因为在我的invocationHandler
中,我没有获得注释(正如您可以看到的,两个数组的长度都为零)。
我的问题是:是否有办法将注释复制到getter和setter中这样我就可以访问我放入注释中的数据了?
可以指定注释的使用站点目标。例如,如果你想同时注释setter和getter,你可以这样做:
@set:YourAnnotation
@get:YourAnnotation
val aProperty: AType
官方文档:https://kotlinlang.org/docs/annotations.html#annotation-use-site-targets