我正在学习 Kotlin,想了解编译后的代码是如何执行的,以及它与使用 Android 执行 Java 代码有何不同。
我还想知道为什么我们写MainActivity::class.java
(class.java
)到引用类文件。
谢谢!
它与使用Android执行Java代码有何不同
其实不然。Android 不执行 Java 代码或 Kotlin 代码。取而代之的是以下链:
-
Java/Kotlin/Scala/etc.编译器采用Java/Kotlin/Scala代码,并在
.class
文件中发出JVM字节码。 -
Android Gradle插件采用JVM字节码,将其转换为Dalvik字节码(使用
dx
程序)并将其打包到.apk
中。 -
当
.apk
文件安装在设备上时,ART将其包含的Dalvik字节码转换为机器码。 -
执行的是机器代码(和/或 Dalvik 字节码)。ART不知道在步骤1中是哪种语言的源代码,也不关心。
我还想知道为什么我们将 MainActivity::class.java(class.java) 编写到引用类文件中。
你没有。编写它以引用与MainActivity
类对应的Class
对象。
基本上 Kotlin 被编译为与 Java 相同的字节码。
您可以在网络上找到 Kotlin 教程。但是他们从来没有解释太多关于生成的字节码,除了"它是jvm字节码"。所以人们会认为Java编译的字节码没有太大区别。
我可以想象一个区别是 Kotlin 用注释来增强生成的字节码,以便启用 Kotlin 特定的语言功能。这可能也是 Kotlin 拥有自己的 KClass 类型的原因。它可能能够读取 kotlin 特定的类注释。实际上,有 2 种类型表示一个类(KClass 和 Class)。老式类类型实例通过类.java引用。
另请注意,Kotlin 可以编译为 JVM 字节码以外的其他语言。在其他情况下,将没有类引用,但仍是 KClass 引用。
教程的一个很好的起点是 https://kotlinlang.org