kotlin - 如何在运行时获取函数文字的注解
问题描述
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 反射检查此类:class _z_additional._13_Reflection_ObtainingAnnotationOfAFunctionLiteral_Test$f2$1
解决方案
推荐阅读
- javascript - 如何根据元数据删除对切片的排序
- datatables - 在 parceljs 中导入数据表
- javascript - 禁用不被视为 HTML 属性
- maven - 大型构建日志的问题
- php - 如何在 Laravel 中插入具有多个不同列的多行
- javascript - Discord bot 开发的 SQL 语法问题 (mySQL 8.0)
- android - 条件片段和导航重用
- ms-access - WScript.Shell 运行时错误 - IwshShell3 失败
- java - 从 Word 文档中读取 .docx 格式的数据作为每个字段,并用 Java 将其保存在数据库中
- pip - Conda 版本 pip install -r requirements.txt --target ./lib