编译的kt文件是由字节码组成的?

我想了解如果编译的kotlin是一个java字节码文件。 在这个例子中,我显示了kt文件和类文件,还有一些我不知道在java中存在的关键字。 例如, open val

编译的kt文件是否由字节码形成? 编译的kt文件是否由JVM直接执行?

Greeting.kt

 package org.jetbrains.kotlin.demo data class Greeting(val id: Long, val content: String) 

GrettingController.kt

 @RestController class GreetingController { val counter = AtomicLong() @GetMapping("/greeting") fun greeting(@RequestParam(value = "name", defaultValue = "World") name: String) = Greeting(counter.incrementAndGet(), "Hello, $name") } 

Greeting.class

 public final data class Greeting public constructor(id: kotlin.Long, content: kotlin.String) { public final val content: kotlin.String /* compiled code */ public final val id: kotlin.Long /* compiled code */ public final operator fun component1(): kotlin.Long { /* compiled code */ } public final operator fun component2(): kotlin.String { /* compiled code */ } } 

GreetingController.class

 @org.springframework.web.bind.annotation.RestController public open class GreetingController public constructor() { public open val counter: java.util.concurrent.atomic.AtomicLong /* compiled code */ @org.springframework.web.bind.annotation.GetMapping public open fun greeting(@org.springframework.web.bind.annotation.RequestParam name: kotlin.String): org.jetbrains.kotlin.demo.Greeting { /* compiled code */ } } 

Kotlin没有被翻译成Java,而是直接编译到JVM字节码( *.class文件)中。 一些Kotlin语言结构实际上不能用Java来表达。

您展示的编译代码只是为了便于阅读而表示为Kotlin伪代码,并且使用存储在类文件中的附加Kotlin元数据。

从Kotlin常见问题解答 :

Kotlin编译的是什么?

当针对JVM时,Kotlin生成Java兼容的字节码。 当针对JavaScript时,Kotlin转换到ES5.1并生成与包括AMD和CommonJS在内的模块系统兼容的代码。 当定位本机时,Kotlin将生成平台特定的代码(通过LLVM)。

另请参阅: 使用IntelliJ IDEA时如何查看字节码 。