Jak przekonwertować plik źródłowy Kotlin na plik źródłowy Java


390

Mam plik źródłowy Kotlin, ale chcę go przetłumaczyć na Javę.

Jak przekonwertować Kotlin na źródło Java?


10
Jestem prawie pewien, że nie stworzono do tego jeszcze zautomatyzowanego narzędzia. Możesz go najpierw zbudować!
Eric Cochran

7
Jest bardzo prawdopodobne, że skończysz z brzydką i niemożliwą do utrzymania klasą Java, która nie uruchomi się, jeśli nie będziesz mieć standardowej biblioteki Kotlin w ścieżce klas. Jaki jest sens?
yole

3
Zastanów się nad tłumaczem j2objC. Byłoby wspaniale, gdybyś mógł zrobić kotlin -> Java -> objC
Patrick

3
Przycisk „Dekompiluj” ma pomóc ludziom zrozumieć, jak działa kompilacja Kotlin. Generowany przez siebie kod Java nie jest przeznaczony do użycia jako rzeczywisty kod produkcyjny (i jest do tego dość nieodpowiedni - na początek nie zawsze się kompiluje ...)
yol

2
@ tak, co powiesz na kogoś, kto nie zna Kotlina lub nie ma czasu na naukę i ma przykładowy kod w tym języku, który ma pewne funkcje, które musi zrozumieć, aby uruchomić swój kod Java?
Michael

Odpowiedzi:


400

Jak powiedział @Vadzim, w IntelliJ lub Android Studio wystarczy wykonać następujące czynności, aby uzyskać kod Java z kotlin:

  1. Menu > Tools > Kotlin > Show Kotlin Bytecode
  2. Kliknij Decompileprzycisk
  3. Skopiuj kod Java

Aktualizacja:

Dzięki najnowszej wersji (1.2+) wtyczki Kotlin możesz także zrobić bezpośrednio Menu > Tools > Kotlin -> Decompile Kotlin to Java.


60
Czy wyjście Java nie jest brzydkie?
Pacerier

20
@Pacerier Podobnie jak większość wyników dekompilacji, jest to oczywiście
Louis CAD

5
konwertowane z kotlin do java. Ale pokazuje dodatkowy kod. kod, którego nawet nigdy nie napisałem ani nie usłyszałem
Nauman Ash

20
ta opcja nie jest włączona, ma kolor szary. Jak mogę to włączyć?
Vikas Pandey,

8
@ VikasPandey, Decompile Kotlin to Javajest obecnie włączony tylko dla skompilowanych klas Kotlin .
Onik

39

Możesz skompilować Kotlina do kodu bajtowego, a następnie użyć dezasemblera Java.

Dekompilacja może odbywać się w IntelliJ Idea lub przy użyciu FernFlower https://github.com/fesh0r/fernflower (dzięki @Jire)

Nie było zautomatyzowanego narzędzia, które sprawdziłem kilka miesięcy temu (i żadnych planów dotyczących jednego AFAIK)


2
Na marginesie należy pamiętać, że generyczne kody w generowanym kodzie mogą powodować ostrzeżenia kompilatora, ponieważ Kotlin dopuszcza pewne rzeczy, których nie robi kompilator Java. Jednak nadal działa w kodzie bajtowym.
Jacob Zimmerman

@voddan Myślę, że odnosi się do reifikowanych generyków, które nie są możliwe w czystej Javie.
Jire

1
@Jire reifikowane generyczne są zawsze wstawiane, więc z Javy wyglądają jak normalne odwołania do klas
voddan


4
IntelliJ IDEA 2016.2: Menu / Narzędzia / Kotlin / Pokaż kod bajtowy Kotlin, a następnie kliknij przycisk Dekompiluj
Vadzim


7

Aby przekonwertować Kotlinplik źródłowy na plik Javaźródłowy, musisz (w Android Studio):

  1. Naciśnij Cmd- Shift- Ana komputerze Mac lub naciśnij Ctrl- Shift- Ana komputerze z systemem Windows.

  2. Wpisz akcję, której szukasz: Kotlin Bytecodei wybierz Show Kotlin Bytecodez menu.

wprowadź opis zdjęcia tutaj

  1. Naciśnij Decompileprzycisk na górze Kotlin Bytecodepanelu.

wprowadź opis zdjęcia tutaj

  1. Teraz otrzymujesz zdekompilowany plik Java wraz z plikiem Kotlin na sąsiedniej karcie:

wprowadź opis zdjęcia tutaj


1
Dziękuję Panu! Ten błędny AS ponownie zmienił normalne narzędzia (Narzędzia> Kotlin> ...).
CoolMind

5

Kompiluję Kotlin do kodu bajtowego, a następnie dekompiluję go do Javy. Kompiluję za pomocą kompilatora Kotlin i dekompiluję za pomocą cfr .

Mój projekt jest tutaj .

To pozwala mi skompilować to:

package functionsiiiandiiilambdas.functions.p01tailiiirecursive

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

Do tego:

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

Jak wspomniał @ louis-cad „Źródło Kotlin -> Kod bajtów Java -> Źródło Java” to jedyne jak dotąd rozwiązanie.

Chciałbym jednak wspomnieć o sposobie, który preferuję: za pomocą dekompilatora Jadx dla Androida .

Pozwala zobaczyć kod generujący zamknięcia i, jak dla mnie, wynikowy kod jest „czystszy” niż kod dekompilatora IntelliJ IDEA.

Zwykle, gdy muszę zobaczyć kod źródłowy Java dowolnej klasy Kotlin, robię:

  • Wygeneruj apk: ./gradlew assembleDebug
  • Otwórz apk za pomocą interfejsu GUI Jadx: jadx-gui ./app/build/outputs/apk/debug/app-debug.apk

W tym GUI działa podstawowa funkcjonalność IDE: wyszukiwanie klasy, deklaracja „kliknij, aby przejść”. itp.

Cały kod źródłowy można zapisać, a następnie wyświetlić przy użyciu innych narzędzi, takich jak IntelliJ IDEA.


Dobry, jest dostępny przez Homebrew:brew install jadx
milosmns

2
  1. otwórz plik Kotlin w Android Studio
  2. przejdź do narzędzi -> kotlin -> kod bajt kotlin
  3. w nowym oknie, które otwiera się obok pliku kotlin, kliknij przycisk dekompilacji. stworzy to java odpowiednik twojego pliku kotlin.

2

Java i Kotlin działają na wirtualnej maszynie Java (JVM).

Konwersja pliku Kotlin do pliku Java wymaga dwóch kroków, tj. Kompilacji kodu Kotlin do kodu bajtowego JVM, a następnie dekompilacji kodu bajtowego do kodu Java.

Kroki, aby przekonwertować plik źródłowy Kotlin na plik źródłowy Java:

  1. Otwórz projekt Kotlin w Android Studio.
  2. Następnie przejdź do Narzędzia -> Kotlin -> Pokaż kod bajtowy Kotlin.

wprowadź opis zdjęcia tutaj

  1. Otrzymasz kod bajtowy swojego pliku Kotin.
  2. Teraz kliknij przycisk Dekompiluj, aby uzyskać kod Java z kodu bajtowego
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.