繁体   English   中英

注释处理:如何更改 Kotlin 代码中的注释目标?

[英]Annotation Processing: how to change annotation target in Kotlin code?

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

data class User(
    val id: String,

    @get:Email
    val email: String
)

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

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

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

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

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

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

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

Kotlin 编译器插件 API 应该是可能的。 这是一个复杂的方式,寿。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM