Kotlin中没有适用于init块的AnnotationTarget是真的吗?

如果这是正确的,那么为什么会这样呢?在我看来,这看起来非常奇怪.

我试过不同的AnnotationTarget,但都不管用.然后,我试着根本不使用@Target()注释,它也不起作用.

推荐答案

Kotlin被设计成能够与Java互操作.Kotlin代码必须能够编译成.class文件.类文件格式没有"init块",因此init块上的注释不能编码到类文件中.

这意味着,如果支持初始化块上的批注,则必须有AnnotationRetention.SOURCE个.这类似于are支持的表达式上的批注.(AnnotationTarget.EXPRESSION).

这意味着只有批注处理器才能使用这些批注.您不能通过反射或判断类文件来访问它们.

具体地说,批注处理器会对102块做什么?我想不出任何必须做的事情来初始化块,这不能做对其他代码块.您已经可以通过在run { ... }上使用AnnotationTarget.EXPRESSION来注释代码块,

class Foo {
    val x: Int
    init {
        @MyAnnotation run {
            // ...
        }

        // if you need to initialise a val
        @MyAnnotation
        x = run {
            // ...
        }
    }
}

当然,如果您有很多val要初始化,并且您想要对每个val进行批注处理,那么您将需要多次编写@MyAnnotation.在这种情况下,最好将其设计为对要处理的所有init块的整个类应用一个注释,并使用另一个注释来表示" Select 退出".

总的来说,我认为init块批注添加的东西很少.

Kotlin相关问答推荐

为什么";";.equals(1)在柯特林语中是有效的,但";";=1是无效的?

Groovy Gradle文件的Kotlin类似功能

当我通过媒体通知更改音乐时不要更新我的 UI

如何优雅地声明一个StateFlow?

Eclipse:无法安装 Kotlin 插件

在 Kotlin 中,我可以在集合上有一个条件构建器元素吗?

如何从kotlin中的ArrayList中删除所有元素

如何从不同的功能发出流量值? Kotlin 协程

如何在 Kotlin 文件中的 Android Studio 中控制何时将 Imports 替换为通配符

如何在Spring Boot应用程序上启用承载身份验证?

Kotlin惰性默认属性

如何在 Jetpack Compose 的 LazyColumn/LazyRow 中禁用和启用滚动?

TornadoFX 中设置 PrimaryStage 或 Scene 属性的方法

Kotlin中保留的关键字是什么?

Kotlin - computed var 属性的用处?

我应该使用Kotlin数据类作为JPA实体吗?

uses-sdk:minSdkVersion 16 不能小于库中声明的版本 23

在android java类中使用Kotlin扩展

Kotlin类型安全类型别名

如何判断数据是否插入到房间数据库中