So konvertieren Sie eine Kotlin-Quelldatei in eine Java-Quelldatei


390

Ich habe eine Kotlin-Quelldatei, möchte diese aber nach Java übersetzen.

Wie kann ich Kotlin in eine Java-Quelle konvertieren?


10
Ich bin mir ziemlich sicher, dass noch kein automatisiertes Tool dafür entwickelt wurde. Sie können es zuerst bauen!
Eric Cochran

7
Es ist sehr wahrscheinlich, dass Sie eine hässliche und nicht wartbare Java-Klasse erhalten, die nicht ausgeführt wird, wenn Sie die Kotlin-Standardbibliothek nicht im Klassenpfad haben. Was ist der Punkt?
Yole

3
Betrachten Sie den j2objC-Übersetzer. Wäre toll, wenn du Kotlin machen könntest -> Java -> objC
Patrick

3
Das Ziel der Schaltfläche "Dekompilieren" ist es, den Menschen zu helfen, die Funktionsweise der Kotlin-Kompilierung zu verstehen. Der Java-Code, den es generiert, ist nicht für die Verwendung als tatsächlicher Produktionscode vorgesehen (und ist dafür ziemlich schlecht geeignet - zunächst wird er nicht immer kompiliert ...)
yole

2
@yole wie wäre es mit jemandem, der Kotlin nicht kennt oder Zeit hat, es zu lernen und einen Beispielcode in dieser Sprache hat, der einige Funktionen hat, die er verstehen muss, damit sein Java-Code funktioniert?
Michael

Antworten:


400

Wie @Vadzim sagte, müssen Sie in IntelliJ oder Android Studio nur Folgendes tun, um Java-Code von kotlin zu erhalten:

  1. Menu > Tools > Kotlin > Show Kotlin Bytecode
  2. Klicken Sie auf die DecompileSchaltfläche
  3. Kopieren Sie den Java-Code

Aktualisieren:

Mit einer aktuellen Version (1.2+) des Kotlin-Plugins können Sie dies auch direkt tun Menu > Tools > Kotlin -> Decompile Kotlin to Java.


60
Ist die Java-Ausgabe nicht hässlich?
Pacerier

20
@ Pacerier Genau wie die meisten Dekompilierungsausgaben ist es natürlich
Louis CAD

5
konvertiert von Kotlin zu Java. Aber es zeigt zusätzlichen Code. der Code, den ich noch nie geschrieben oder gehört habe
Nauman Ash

20
Diese Option ist nicht aktiviert, sie ist grau gefärbt. Wie aktiviere ich es?
Vikas Pandey

8
@VikasPandey Decompile Kotlin to Javaist derzeit nur für kompilierte Kotlin-Klassen aktiviert .
Onik

39

Sie können Kotlin zu Bytecode kompilieren und dann einen Java-Disassembler verwenden.

Die Dekompilierung kann in IntelliJ Idea oder mithilfe von FernFlower https://github.com/fesh0r/fernflower erfolgen (danke @Jire).

Es gab kein automatisiertes Tool, wie ich vor ein paar Monaten überprüft habe (und keine Pläne für eine AFAIK)


2
Beachten Sie, dass Generika im generierten Code Compiler-Warnungen verursachen können, da Kotlin einige Dinge zulässt, die der Java-Compiler nicht zulässt. Es funktioniert jedoch immer noch im Bytecode.
Jacob Zimmerman

@voddan Ich denke, er bezieht sich auf reifizierte Generika, die in reinem Java keine Möglichkeit sind.
Jire

1
@ Jire reified Generics sind immer inline, so dass sie von Java aus wie normale Klassenreferenzen aussehen
Voddan


4
IntelliJ IDEA 2016.2: Menü / Tools / Kotlin / Kotlin-Bytecode
anzeigen


7

Um eine KotlinQuelldatei in eine JavaQuelldatei zu konvertieren , müssen Sie (wenn Sie in Android Studio sind):

  1. Presse Cmd- Shift- Aauf einem Mac oder drücken Ctrl- Shift- Aauf einem Windows - Rechner.

  2. Geben Sie die gewünschte Aktion ein: Kotlin Bytecodeund wählen Sie Show Kotlin Bytecodeaus dem Menü.

Geben Sie hier die Bildbeschreibung ein

  1. Drücken Sie die DecompileTaste oben im Kotlin BytecodeBedienfeld.

Geben Sie hier die Bildbeschreibung ein

  1. Jetzt erhalten Sie eine dekompilierte Java-Datei zusammen mit der Kotlin-Datei auf einer nebenstehenden Registerkarte:

Geben Sie hier die Bildbeschreibung ein


1
Danke mein Herr! Dieser fehlerhafte AS hat wieder die normalen Werkzeuge geändert (Werkzeuge> Kotlin> ...).
CoolMind

5

Ich kompiliere Kotlin zu Bytecode und dekompiliere diesen dann zu Java. Ich kompiliere mit dem Kotlin-Compiler und dekompiliere mit cfr .

Mein Projekt ist hier .

Dies ermöglicht mir Folgendes zu kompilieren:

package functionsiiiandiiilambdas.functions.p01tailiiirecursive

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

Dazu:

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

Wie @ louis-cad erwähnte, ist "Kotlin-Quelle -> Javas Bytecode -> Java-Quelle" die einzige Lösung, die es bisher gab.

Aber ich möchte den Weg erwähnen, den ich bevorzuge: Jadx Decompiler für Android verwenden .

Es ermöglicht das Anzeigen des generierten Codes für Schließungen, und für mich ist der resultierende Code "sauberer" als einer vom IntelliJ IDEA-Dekompiler.

Normalerweise mache ich Folgendes, wenn ich Java-Quellcode einer Kotlin-Klasse sehen muss:

  • Generiere apk: ./gradlew assembleDebug
  • Öffne apk über die Jadx GUI: jadx-gui ./app/build/outputs/apk/debug/app-debug.apk

In dieser GUI funktioniert die grundlegende IDE-Funktionalität: Klassensuche, Click-to-Go-Deklaration. usw.

Außerdem könnte der gesamte Quellcode gespeichert und dann mit anderen Tools wie IntelliJ IDEA angezeigt werden.


Gut, es ist über Homebrew erhältlich:brew install jadx
Milosmns

2
  1. Öffnen Sie die Kotlin-Datei in Android Studio
  2. Gehen Sie zu tools -> kotlin -> kotlin bytecode
  3. Klicken Sie in dem neuen Fenster, das neben Ihrer Kotlin-Datei geöffnet wird, auf die Schaltfläche zum Dekompilieren. Es wird ein Java-Äquivalent Ihrer Kotlin-Datei erstellt.

2

Java und Kotlin laufen auf Java Virtual Machine (JVM).

Das Konvertieren einer Kotlin-Datei in eine Java-Datei umfasst zwei Schritte: Kompilieren des Kotlin-Codes in den JVM-Bytecode und anschließendes Dekompilieren des Bytecodes in den Java-Code.

Schritte zum Konvertieren Ihrer Kotlin-Quelldatei in eine Java-Quelldatei:

  1. Öffnen Sie Ihr Kotlin-Projekt im Android Studio.
  2. Navigieren Sie dann zu Extras -> Kotlin -> Kotlin-Bytecode anzeigen.

Geben Sie hier die Bildbeschreibung ein

  1. Sie erhalten den Bytecode Ihrer Kotin-Datei.
  2. Klicken Sie nun auf die Schaltfläche Dekompilieren, um Ihren Java-Code aus dem Bytecode abzurufen
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.