Converting a Kotlin File to Java
1.概述
Kotlin以与Java的互操作性而闻名。当然,这是可行的,因为它们都在Java虚拟机上运行-换句话说,它们被编译为相同的字节码。
在本教程中,我们将探索两种方法来执行从Kotlin文件到Java文件的转换。
2.为什么要将Kotlin转换为Java?
首先,让我们考虑一下为什么要进行这种转换的几个原因:
了解幕后的真实情况
调查性能问题
从我们的项目中摆脱Kotlin
从Kotlin到Java的转换需要两个步骤。我们需要将Kotlin代码编译为JVM字节码。然后,我们需要将结果反编译为Java代码。
但是,此过程永远不会给我们提供正确运行的生产代码。因此,通常需要进一步的手工工作。
在下一节中,我们将仔细研究执行转换的两种方法。
3.使用命令行工具进行转换
假设我们有一个Kotlin文件名称Sample.kt,其内容如下:
1 2 3 4 5 | fun printEvenNumbers() { for (i in 0..10 step 2) { println(i) } } |
首先,让我们使用以下命令编译代码:
1 | kotlinc Sample.kt |
结果,将创建一个名称为SampleKt.class的文件。
现在,我们需要将该文件反编译为Java。
为此,我们将使用FernFlower。我们可以通过下载项目并运行Gradle构建来获取fernflower.jar。有了JAR文件后,要运行的命令是:
1 | java -jar fernflower.jar SampleKt.class . |
之后,我们将看到文件SampleKt.java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | import kotlin.Metadata; import kotlin.ranges.IntProgression; import kotlin.ranges.IntRange; import kotlin.ranges.RangesKt; @Metadata( mv = {1, 1, 15}, bv = {1, 0, 3}, k = 2, d1 = {"\u0000\u0006 \u0000 \u0002\u0010\u0002\u001a\u0006\u0010\u0000\u001a\u00020\u0001"}, d2 = {"printEvenNumbers",""} ) public final class SampleKt { public static final void printEvenNumbers() { byte var3 = 0; IntProgression var10000 = RangesKt.step((IntProgression)(new IntRange(var3, 10)), 2); int i = var10000.getFirst(); int var1 = var10000.getLast(); int var2 = var10000.getStep(); if (var2 >= 0) { if (i > var1) { return; } } else if (i < var1) { return; } while(true) { boolean var4 = false; System.out.println(i); if (i == var1) { return; } i += var2; } } } |
如我们所见,代码非常复杂。此外,它仍然具有Kotlin语言依赖性。由于可读性和性能,我们获得了一段在生产中无用的代码。
4.使用IntelliJ IDEA进行转换
使用IntelliJ IDEA,我们可以更方便地完成相同的两个步骤。
要将源代码编译为字节码,请从主上下文菜单中单击工具-> Kotlin->显示Kotlin字节码。
将会出现一张新卡,并且我们应该能够以人类可读的形式看到JVM字节码:
从那里,我们只需单击反编译按钮即可生成Java文件。请注意,IntelliJ IDEA在后台使用Fernflower,因此生成的Java文件将与上面显示的文件相同。
5.结论
在本快速教程中,我们学习了将Kotlin文件转换为Java的两种方法。
我们还讨论了一些有用的过程,以及为什么在生产代码中应避免使用此过程。