Cara mengonversi file sumber Kotlin ke file sumber Java


389

Saya memiliki file sumber Kotlin, tetapi saya ingin menerjemahkannya ke Java.

Bagaimana saya bisa mengonversi Kotlin ke sumber Java?


10
Saya cukup yakin belum ada alat otomatis yang dibuat untuk ini. Anda bisa membangunnya dulu!
Eric Cochran

7
Sangat mungkin bahwa Anda akan berakhir dengan kelas Java yang jelek dan tidak terawat yang tidak akan berjalan jika Anda tidak memiliki perpustakaan standar Kotlin di classpath. Apa gunanya?
Yole

3
Pertimbangkan penerjemah j2objC. Akan lebih bagus jika Anda bisa melakukan kotlin -> Java -> objC
Patrick

3
Tujuan dari tombol "Dekompilasi" adalah untuk membantu orang memahami bagaimana kompilasi Kotlin bekerja. Kode Java yang dihasilkannya tidak dimaksudkan untuk digunakan sebagai kode produksi aktual (dan sangat tidak cocok untuk itu - untuk memulainya, itu tidak selalu mengkompilasi ...)
yole

2
@Yole bagaimana kalau seseorang yang tidak mengenal Kotlin atau punya waktu untuk mempelajarinya dan telah mendapatkan beberapa kode sampel dalam bahasa itu yang memiliki beberapa fungsi yang perlu mereka pahami agar kode Java mereka berfungsi?
Michael

Jawaban:


400

Seperti yang dikatakan @Vadzim, di IntelliJ atau Android Studio, Anda hanya perlu melakukan yang berikut untuk mendapatkan kode java dari kotlin:

  1. Menu > Tools > Kotlin > Show Kotlin Bytecode
  2. Klik pada Decompiletombol
  3. Salin kode java

Memperbarui:

Dengan versi terbaru (1.2+) dari plugin Kotlin Anda juga dapat langsung melakukannya Menu > Tools > Kotlin -> Decompile Kotlin to Java.


60
Apakah output Java tidak jelek?
Pacerier

20
@Pacerier Sama seperti kebanyakan output dekompilasi, tentu saja
Louis CAD

5
dikonversi dari kotlin ke java. Tapi itu menunjukkan kode tambahan. kode yang bahkan tidak pernah saya tulis atau dengar
Nauman Ash

20
opsi itu tidak diaktifkan, warnanya abu-abu. Bagaimana cara mengaktifkannya.
Vikas Pandey

8
@VikasPandey, Decompile Kotlin to Javasaat ini diaktifkan hanya untuk kelas Kotlin yang dikompilasi .
Onik

39

Anda dapat mengkompilasi Kotlin ke bytecode, lalu menggunakan Java disassembler.

Dekompilasi dapat dilakukan di dalam IntelliJ Idea, atau menggunakan FernFlower https://github.com/fesh0r/fernflower (terima kasih @Jire)

Tidak ada alat otomatis ketika saya memeriksa beberapa bulan yang lalu (dan tidak ada rencana untuk satu AFAIK)


2
Sebagai catatan, ketahuilah bahwa obat generik dalam kode yang dihasilkan dapat menyebabkan peringatan kompiler, karena Kotlin mengizinkan beberapa hal yang tidak dimiliki kompiler java. Masih bekerja dalam kode byte.
Jacob Zimmerman

@voddan saya pikir dia merujuk ke reified generics, yang bukan kemungkinan di Jawa murni.
Jire

1
@Jire reified generics selalu digarisbawahi, jadi dari Jawa mereka terlihat seperti referensi kelas normal
voddan


4
IntelliJ IDEA 2016.2: Menu / Tools / Kotlin / Show Kotlin Bytecode, lalu klik tombol
Dekompilasi


7

Untuk mengonversi Kotlinfile sumber ke file Javasumber yang perlu (ketika Anda di Android Studio):

  1. Tekan Cmd- Shift- Apada Mac, atau tekan Ctrl- Shift- Apada mesin Windows.

  2. Ketikkan tindakan yang Anda cari: Kotlin Bytecodedan pilih Show Kotlin Bytecodedari menu.

masukkan deskripsi gambar di sini

  1. Tekan Decompiletombol di bagian atas Kotlin Bytecodepanel.

masukkan deskripsi gambar di sini

  1. Sekarang Anda mendapatkan file Java yang Didekompilasi bersama dengan file Kotlin di tab yang berdekatan:

masukkan deskripsi gambar di sini


1
Terima kasih Pak! Buggy AS ini sekali lagi mengubah alat normal (Tools> Kotlin> ...).
CoolMind

5

Saya mengkompilasi Kotlin ke kode byte dan kemudian de-kompilasi itu ke Jawa. Saya kompilasi dengan kompiler Kotlin dan de-kompilasi dengan cfr .

Proyek saya ada di sini .

Ini memungkinkan saya untuk mengkompilasi ini:

package functionsiiiandiiilambdas.functions.p01tailiiirecursive

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

Untuk ini:

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

Seperti @ louis-cad menyebutkan "sumber Kotlin -> kode byte Java -> sumber Java" adalah satu-satunya solusi sejauh ini.

Tapi saya ingin menyebutkan caranya, yang saya sukai: menggunakan Jadx decompiler untuk Android .

Hal ini memungkinkan untuk melihat kode yang menghasilkan penutupan dan, bagi saya, kode yang dihasilkan adalah "bersih" kemudian satu dari dekompiler IntelliJ IDEA.

Biasanya ketika saya perlu melihat kode sumber Java dari setiap kelas Kotlin yang saya lakukan:

  • Buat apk: ./gradlew assembleDebug
  • Buka apk menggunakan Jadx GUI: jadx-gui ./app/build/outputs/apk/debug/app-debug.apk

Dalam fungsi IDE dasar GUI ini berfungsi: pencarian kelas, klik untuk pergi deklarasi. dll.

Juga semua kode sumber dapat disimpan dan kemudian dilihat menggunakan alat lain seperti IntelliJ IDEA.


Bagus, tersedia melalui Homebrew:brew install jadx
milosmns

2
  1. buka file kotlin di android studio
  2. pergi ke alat -> kotlin -> kotlin bytecode
  3. di jendela baru yang terbuka di samping file kotlin Anda, klik tombol dekompilasi. itu akan membuat setara java dari file kotlin Anda.

2

Java dan Kotlin berjalan pada Java Virtual Machine (JVM).

Mengubah file Kotlin ke file Java melibatkan dua langkah yaitu mengkompilasi kode Kotlin ke bytecode JVM dan kemudian mendekompilasi bytecode ke kode Java.

Langkah-langkah untuk mengonversi file sumber Kotlin Anda ke file sumber Java:

  1. Buka proyek Kotlin Anda di Android Studio.
  2. Kemudian arahkan ke Tools -> Kotlin -> Show Kotlin Bytecode.

masukkan deskripsi gambar di sini

  1. Anda akan mendapatkan bytecode dari file Kotin Anda.
  2. Sekarang klik pada tombol Decompile untuk mendapatkan kode Java Anda dari bytecode
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.