【问题标题】:Annotation Processing: how to change annotation target in Kotlin code?注释处理:如何在 Kotlin 代码中更改注释目标?
【发布时间】:2020-12-17 19:38:48
【问题描述】:

很多时候,当我在 Kotlin 代码中使用 Java 库中的注解时,我必须指定目标,以便指定编译代码中必须注解的元素:

data class User(
    val id: String,

    @get:Email
    val email: String
)

我希望能够简单地使用@Email,而不是指定@get:Email,尤其是当它出现在很多地方时。

问题:有没有办法提示 Kotlin 编译器在所有地方使用不同的目标,这样如果我使用 @Email,它会像处理 @get:Email 一样处理它?或者有没有其他方法可以省略指定目标?如何实现?是否可以通过注解处理在编译阶段完成(如Lombok 那样)?

即使他们没有直接回答我的问题,我也会很感激任何想法。

【问题讨论】:

    标签: java kotlin annotation-processing kapt kotlinc


    【解决方案1】:

    你不能覆盖它。也许创建一个以@Email 为目标的注解,并在它尝试调用目标时提供属性getter。

    指定目标由注释目标决定。当注解的目标指定为jvm use-targets 时,您必须使用@get: 指定注解的目标是属性的getter。

    为了简单地使用@Email,您必须使用kotlin target types 作为注释,可能是PROPERTY。请注意,PROPERTY 目标不适用于 Java。

    @Retention(AnnotationRetention.RUNTIME)
    @Target(AnnotationTarget.PROPERTY)
    annotation class Email
    

    【讨论】:

      【解决方案2】:

      应该可以使用 Kotlin Compiler 插件 API。这是一个复杂的方式,虽然。

      要实现这一点,您需要添加一个 ClassBuilder 拦截器,其中的访问者处理 @Email 注释并指定正确的目标。

      如果访问者就足够了,或者您还需要在编译器阶段之一修改源代码,就不能说不深入,请检查 TreeVisitor。

      【讨论】:

        猜你喜欢
        • 2023-03-04
        • 1970-01-01
        • 1970-01-01
        • 2020-05-04
        • 1970-01-01
        • 2011-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多