编译的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时如何查看字节码 。