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


390

我有一个Kotlin源文件,但是我想将其转换为Java。

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


10
我很确定还没有为此构建任何自动化工具。您可以先构建它!
埃里克·科克伦

7
如果您在类路径中没有Kotlin标准库,很可能最终将得到一个丑陋且难以维护的Java类,该类将无法运行。重点是什么?
yole

3
考虑使用j2objC转换器。如果您可以做kotlin-> Java-> objC,那就太好了
Patrick

3
“反编译”按钮的目的是帮助人们了解Kotlin编译的工作方式。它生成的Java代码不适合用作实际的生产代码(并且非常不适合该代码-首先,它并不总是编译...)
yole

2
@yole对于不了解Kotlin或没有时间学习它并以该语言获得一些示例代码的人来说,这些示例代码需要他们了解一些功能才能使Java代码正常工作?
迈克尔

Answers:


400

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

  1. Menu > Tools > Kotlin > Show Kotlin Bytecode
  2. 点击Decompile按钮
  3. 复制Java代码

更新:

使用Kotlin插件的最新版本(1.2+),您也可以直接执行Menu > Tools > Kotlin -> Decompile Kotlin to Java


60
Java输出不是很丑吗?
佩里耶

20
@Pacerier就像大多数反编译输出一样,它当然是
路易CAD

5
从kotlin转换为Java。但是它显示了额外的代码。我什至从未写过或听过的代码
Nauman Ash

20
该选项未启用,显示为灰色。我如何启用它。
维卡斯·潘迪

8
@VikasPandey,Decompile Kotlin to Java目前仅对编译的Kotlin类启用。
Onik

39

您可以将Kotlin编译为字节码,然后使用Java反汇编程序。

可以在IntelliJ Idea内完成反编译,也可以使用FernFlower https://github.com/fesh0r/fernflower(感谢@Jire)完成反编译

几个月前我没有检查过自动化工具(也没有计划使用AFAIK)


2
附带说明一下,请注意,由于Kotlin允许Java编译器不允许的某些操作,因此生成的代码中的泛型可能会引起编译器警告。不过,它仍然可以字节码工作。
雅各布·齐默曼

@voddan我认为他指的是泛型泛型,这在纯Java中是不可能的。
吉雷

1
@Jire化的泛型始终是内联的,因此从Java来看,它们看起来像普通的类引用
voddan


4
IntelliJ IDEA 2016.2:菜单/工具/ Kotlin /显示Kotlin字节码,然后单击“反编译”按钮
Vadzim 2016年


7

要将Kotlin源文件转换为源文件,Java您需要(在Android Studio中):

  1. 新闻Cmd- Shift- A在Mac上,或按Ctrl- Shift- A在Windows机器上。

  2. 输入您要查找的操作:,Kotlin Bytecode然后Show Kotlin Bytecode从菜单中选择。

在此处输入图片说明

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

在此处输入图片说明

  1. 现在,在相邻的选项卡中,您将获得反编译的Java文件以及Kotlin文件:

在此处输入图片说明


1
谢谢你,先生!这个越野车AS再次更改了常规工具(工具> Kotlin> ...)。
CoolMind

5

我将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);
  }
}

4

正如@ louis-cad提到的那样,“ Kotlin源-> Java的字节码-> Java源”是迄今为止唯一的解决方案。

但我想提一提我喜欢的方式:使用Android的Jadx反编译器

它允许查看生成的闭包代码,对我而言,生成的代码“更干净”,然后是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

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

2

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

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

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

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

在此处输入图片说明

  1. 您将获得Kotin文件的字节码。
  2. 现在单击“反编译”按钮以从字节码中获取Java代码
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.