如何解决如何在运行时获取函数文字的注释
package _z_additional
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.TestInstance
import kotlin.reflect.KFunction
import kotlin.reflect.full.declaredMemberFunctions
import kotlin.reflect.jvm.reflect
/*https://stackoverflow.com/questions/63439469/how-to-obtain-an-annotation-of-a-function-literal-at-runtime*/
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
object _13_Reflection_ObtainingAnnotationOfAFunctionLiteral_Test {
@Target(AnnotationTarget.FUNCTION)
private annotation class A
//@formatter:off
@A private fun f1() {}
private val f2: () -> Unit = @A {}
private val f3: () -> Unit = @A fun() {}
//@formatter:on
@Test
fun demonstrate_usingReflect() {
listOf(::f1,f2.reflect(),f3.reflect()).filterNotNull().withIndex().forEach { (index,f) ->
println("[$index] Function name = ${f.name}")
println("[$index] Annotations = ${f.annotations.joinToString()}")
println()
}
}
@Test
fun demonstrate_usingClass() {
listOf(f2::class,f3::class).withIndex().forEach { (index,cls) ->
val invokeFunction: KFunction<*> = cls.declaredMemberFunctions.first {it.name == "invoke" && it.isOperator}
println("[$index] Function name = ${invokeFunction.name}")
println("[$index] Annotations = ${invokeFunction.annotations.joinToString()}")
println()
}
}
}
demonstrate_usingReflect
输出
[0]函数名称= f1 [0]注释= @ _z_additional._13_Reflection_ObtainingAnnotationOfAFunctionLiteral_Test $ A()
[1]函数名称= [1]注释=
[2]函数名称= [2]注释=
demonstrate_usingClass
错误输出
java.lang.UnsupportedOperationException:此类是由Kotlin编译器生成的内部综合类,例如lambda的匿名类,SAM包装器,可调用的引用等。它不是Kotlin类或接口,因此反射库不知道它有什么声明。请使用Java反射检查此类:_z_additional._13_Reflection_ObtainingAnnotationOfAFunctionLiteral_Test $ f2 $ 1
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。