【问题标题】:Is there a way to use an annotation class as a decorator on a function in Kotlin?有没有办法使用注释类作为 Kotlin 中函数的装饰器?
【发布时间】:2021-06-15 23:39:30
【问题描述】:

我是 Kotlin 开发的新手,我在文档中遇到了自定义注释类。

我有没有办法在函数上使用注释来预填充一些变量,或者在运行带注释的函数之前运行装饰器函数?

类似:

class TestClass {

    @Friendly("Hello World")
    private fun testFun() {
        greet()
        //does something else
    }
}

带有注释类

@Target(AnnotationTarget.FUNCTION)
@Retention(AnnotationRetention.BINARY)
annotation class Friendly(val message: String) {
    fun greet() {
        println(message)
    }
}

我知道这不是有效的 Kotlin 代码,但我找不到任何示例说明如何在不使用反射的情况下实际使用注释中的值(如果可能的话)

如果我能做这样的事情,更有用的是,请告诉我关于 Kotlin 注释类的更好资源?

【问题讨论】:

    标签: kotlin annotations decorator


    【解决方案1】:

    要使用您的自定义注解,您需要创建自己的注解处理器(并使用kapt Kotlin 编译器插件)以在编译时生成一些新的源(但不能修改现有的!),或者使用@987654327 @meta-annotation(在 Kotlin 中是默认的),以便它们可以在运行时通过 reflection 访问。

    您正在使用的@Retention(AnnotationRetention.BINARY) 元注释相当于java 中的@Retention(RetentionPolicy.CLASS),这几乎是无用的(参见https://stackoverflow.com/a/5971247/13968673)。

    你试图用注释做什么(在方法执行之前/之后调用一些额外的代码)提醒我aspect-oriented programming。看看Spring AOPAspectJ 框架,遵循这个范式,以及它们的注释处理方法。 TL;DR:Spring AOP 在运行时处理注解,生成带有尊重代码的代理类,而 AspectJ 使用自己的编译器(即使不是注解处理器,因为它也为 java 语言引入了自己的语法扩展),并且可以生成在编译时尊重字节码。它们最初都是面向 Java 的,但在配置方面有些麻烦,也可以与 Kotlin 一起使用。

    【讨论】:

      猜你喜欢
      • 2013-02-10
      • 2019-06-16
      • 2012-05-11
      • 2021-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-24
      • 2020-01-11
      相关资源
      最近更新 更多