【问题标题】:Local function reflection Kotlin局部函数反射 Kotlin
【发布时间】:2020-10-29 06:00:36
【问题描述】:

我了解如何在类中获取已声明的函数。

例子:

@Target(AnnotationTarget.FUNCTION)
annotation class Foo (val name: String)

class Bar {
    fun main() {
        val declaredMethods = this::class.java.declaredMethods

        declaredMethods.filter {
            it.isAnnotationPresent(Foo::class.java)
        }.forEach {
            it.invoke(this)
        }
    }

    @Foo("foo")
    fun baz() {
        println("foo")
    }
}

现在,我想检索具有注释的本地函数。

例子:

@Target(AnnotationTarget.FUNCTION)
annotation class Foo (val name: String)

@Foo("foo")
fun baz() {
    println("foo")
}

提前谢谢你, 再见

为 Konstantin Raspopov 编辑:感谢您的回答,遗憾的是我的函数位于不同的文件中,我不知道类的名称。

【问题讨论】:

  • 您可以在每个带有函数的文件中添加@file:JvmName("Utils") @file:JvmMultifileClass注解,然后编译器将生成一个具有指定名称的Java外观类。你的情况有可能吗?

标签: kotlin reflection


【解决方案1】:

假设您的代码位于文件Hello.kt,您可以这样做:

@Target(AnnotationTarget.FUNCTION)
annotation class Foo (val name: String)

@Foo("foo")
fun baz() {
    println("foo")
}

fun main() {
    val clazz = Class.forName("HelloKt")
    val declaredMethods = clazz.declaredMethods

    declaredMethods.filter {
        it.isAnnotationPresent(Foo::class.java)
    }.forEach {
        it.invoke(clazz)
    }
}

【讨论】:

  • 感谢您的回答,我更新了我的问题。如果您有任何解决此问题的答案,我将很高兴阅读。
猜你喜欢
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多