微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

有没有办法在 Kotlin 中使用注解类作为函数的装饰器?

如何解决有没有办法在 Kotlin 中使用注解类作为函数的装饰器?

我对 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 注释类的更好资源?

解决方法

要使用自定义注解,您需要创建自己的注解处理器(并使用 kapt Kotlin 编译器插件)在编译时生成一些新源(但不能修改现有源!),或者使用@Retention(AnnotationRetention.RUNTIME) 元注释(在 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 一起使用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。