2

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

data class User(
    val id: String,

    @get:Email
    val email: String
)

我不想指定@get:Email,而是希望能够简单地使用@Email,特别是如果它出现在很多地方。

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

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

4

2 回答 2

1

Kotlin Compiler 插件 API 应该可以实现。这是一个复杂的方式,寿。

为此,您需要添加一个带有访问者处理@Email注释并指定正确目标的 ClassBuilder 拦截器。

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

于 2020-12-25T23:40:17.910 回答
1

你不能覆盖它。也许创建一个注解,该注解将定位@Email注解并在它尝试调用目标时提供属性获取器。

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

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

@Retention(AnnotationRetention.RUNTIME)
@Target(AnnotationTarget.PROPERTY)
annotation class Email
于 2020-12-18T10:50:03.053 回答