注释未复制到 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
所以,我有这个注释 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