如何将 Kotlin 源文件转换为 Java 源文件?

528

我有一个Kotlin源文件,但我想将其翻译为Java。

如何将Kotlin转换为Java源代码?


18
我非常确定还没有为此构建自动化工具。你可以先构建它! - Eric Cochran
13
如果你的类路径中没有Kotlin标准库,很可能你会得到一个丑陋且难以维护的Java类,而且无法运行。那还有什么意义呢? - yole
4
考虑使用j2objC翻译器。如果您能够将Kotlin翻译成Java,再将其翻译成Objective-C就很不错。 - Patrick Jackson
4
“反编译”按钮的目的是帮助人们了解Kotlin编译的工作原理。它生成的Java代码并不适合用于实际的生产代码(而且很难胜任这个任务——首先,它并不总是能够编译成功……) - yole
6
对于不懂 Kotlin 或者没有时间学习 Kotlin,并且手头有一些用 Kotlin 写的示例代码,其中包含一些需要理解才能让 Java 代码正常工作的功能,您有什么建议吗? - Michael
显示剩余4条评论
8个回答

532

如@Vadzim所说,在IntelliJ或Android Studio中,您只需执行以下操作即可从Kotlin获取Java代码:

  1. 菜单> 工具> Kotlin> 显示Kotlin字节码
  2. 单击反编译按钮
  3. 复制Java代码

更新:

在最新版本(1.2+)的Kotlin插件中,您还可以直接执行菜单> 工具> Kotlin-> 反编译Kotlin到Java


81
Java 的输出不丑吧? - Pacerier
29
像大多数反编译的输出一样,它当然可以实现目的。 - Louis CAD
7
已将代码从 Kotlin 转换为 Java,但出现了额外的代码。这些代码我甚至从未编写或听说过。 - Nauman Ash
5
因为您编写的是 Kotlin 代码,而不是 Java。Kotlin 特性依赖于字节码,不能像您预期的那样直接转换为 Java。此外,它还有额外的检查,主要是针对可为空性,以及合成方法和字段。 - Louis CAD
35
该选项未启用,已被标灰色。如何启用它? - Vikas Pandey
15
目前仅对编译后的 Kotlin 类启用“将 Kotlin 反编译为 Java”功能。 - Onik

44
你可以将Kotlin编译为字节码,然后使用Java反汇编器进行反汇编。
反汇编可以在IntelliJ Idea中完成,或者使用FernFlower https://github.com/fesh0r/fernflower(感谢@Jire)。
截至我几个月前的检查,没有自动化工具可用,而且也没有计划推出任何自动化工具。

2
顺便提一下,请注意生成代码中的泛型可能会引起编译器警告,因为 Kotlin 允许一些 Java 编译器不允许的操作。但是它仍然可以在字节码中正常工作。 - Jacob Zimmerman
@voddan 我认为他指的是具体化的泛型,在纯Java中不可能实现。 - Jire
1
@Jire 具体化的泛型始终是内联的,因此从 Java 中看起来就像普通的类引用。 - voddan
3
这就是我所说的。这是一个关于https://dev59.com/5pLea4cB1Zd3GeqP9Pc7的问题,当使用由Kotlin数据类生成的代码时出现了不兼容类型的错误。 - Jacob Zimmerman
5
IntelliJ IDEA 2016.2:菜单/工具/Kotlin/显示 Kotlin 字节码,然后点击反编译按钮。 - Vadzim
是的,但更简单的解决方案在网上(已知的旧服务):http://www.javadecompilers.com/ - user1742529

44

您可以前往工具 > Kotlin > 显示Kotlin字节码

输入图像描述

输入图像描述

输入图像描述


目前它被禁用了。但是你可以使用@ARGeo的答案(https://dev59.com/BlsW5IYBdhLWcg3wdXCT#54116131)。 - CoolMind

19
在Android Studio中,要将Kotlin源文件转换为Java源文件,需要执行以下操作:
  1. 在Mac上按下Cmd-Shift-A, 或在Windows机器上按下Ctrl-Shift-A

  2. 键入您要查找的操作: Kotlin Bytecode并从菜单中选择Show Kotlin Bytecode

enter image description here

  1. 点击Kotlin Bytecode面板顶部的Decompile按钮。

enter image description here

  1. 现在你可以在相邻的选项卡中获得一份反编译的Java文件和Kotlin文件:

enter image description here


3
谢谢您,先生!这个错误的 AS 再次更改了正常的工具(工具 > Kotlin > ...)。 - CoolMind

10

我将Kotlin编译为字节码,然后将其反编译为Java。 我使用Kotlin编译器进行编译,使用cfr进行反编译。

我的项目在这里

这样可以使我编译出以下内容:

package functionsiiiandiiilambdas.functions.p01tailiiirecursive

tailrec fun findFixPoint(x: Double = 1.0): Double =
        if (x == Math.cos(x)) x else findFixPoint(Math.cos(x))

变成这样:

package functionsiiiandiiilambdas.functions.p01tailiiirecursive;

public final class ExampleKt {

    public static final double findFixPoint(double x) {
        while (x != Math.cos(x)) {
            x = Math.cos(x);
        }
        return x;
    }

    public static /* bridge */ /* synthetic */ double findFixPoint$default(double d, int n, Object object) {
        if ((n & 1) != 0) {
            d = 1.0;
        }
        return ExampleKt.findFixPoint(d);
    }
}

6
如@louis-cad所提到的,“Kotlin源码-> Java字节码-> Java源码”是目前唯一的解决方案。

但是,我想提到我更喜欢的方法:使用Jadx decompiler for Android

它允许查看闭包的生成代码,而且对我来说,结果代码比IntelliJ IDEA反编译器生成的代码更“清晰”。

通常,当我需要查看任何Kotlin类的Java源代码时,我会执行以下操作:

  • 生成apk:./gradlew assembleDebug
  • 使用Jadx GUI打开apk:jadx-gui ./app/build/outputs/apk/debug/app-debug.apk

在此GUI中,基本的IDE功能可用:类搜索、单击跳转到声明等。

还可以保存所有源代码,然后使用其他工具(如IntelliJ IDEA)查看。


不错,它可以通过Homebrew获取:brew install jadx - milosmns

3

Java和Kotlin运行在Java虚拟机(JVM)上。

将Kotlin文件转换为Java文件包括两个步骤,即将Kotlin代码编译为JVM字节码,然后将字节码反编译为Java代码。

将Kotlin源文件转换为Java源文件的步骤:

  1. 在Android Studio中打开您的Kotlin项目。
  2. 然后转到“工具” ->“Kotlin” ->“显示Kotlin字节码”。

enter image description here

  1. 您将获得Kotin文件的字节码。
  2. 现在单击“反编译”按钮以从字节码获取Java代码。

3
  1. 在Android Studio中打开Kotlin文件
  2. 转到工具->Kotlin->Kotlin字节码
  3. 在您的Kotlin文件旁边打开的新窗口中,点击反编译按钮。它将创建与您的Kotlin文件等效的Java文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接