Kotlin kaynak dosyasını Java kaynak dosyasına dönüştürme


390

Bir Kotlin kaynak dosyam var, ancak Java'ya çevirmek istiyorum.

Kotlin'i Java kaynağına nasıl dönüştürebilirim?


10
Bunun için henüz otomatik bir araç oluşturulmadığından eminim. Önce inşa edebilirsiniz!
Eric Cochran

7
Büyük olasılıkla sınıf yolunda Kotlin standart kütüphanesi yoksa çalışmayan çirkin ve sürdürülemez bir Java sınıfı ile karşılaşacaksınız. Amaç ne?
yole

3
J2objC çevirmenini düşünün. Eğer kotlin -> Java -> objC
Patrick

3
"Decompile" düğmesinin amacı, insanların Kotlin derlemesinin nasıl çalıştığını anlamalarına yardımcı olmaktır. Ürettiği Java kodu, gerçek üretim kodu olarak kullanılmak üzere tasarlanmamıştır (ve bunun için oldukça uygun değildir
başlangıçta

2
@yole Kotlin'i tanımayan ya da öğrenmek için vakti olan ve Java dillerinin çalışması için anlamaları gereken bazı işlevlere sahip bazı örnek kodları olan biri için ne dersiniz?
Michael

Yanıtlar:


400

@Vadzim'in söylediği gibi, IntelliJ veya Android Studio'da java kodunu kotlin'den almak için aşağıdakileri yapmanız yeterlidir:

  1. Menu > Tools > Kotlin > Show Kotlin Bytecode
  2. Düğmesini Decompiletıklayın
  3. Java kodunu kopyalayın

Güncelleme:

Kotlin eklentisinin son sürümü (1.2+) ile de doğrudan yapabilirsiniz Menu > Tools > Kotlin -> Decompile Kotlin to Java.


60
Java çıktısı çirkin değil mi?
Pacerier

20
@Pacerier Çoğu ayrıştırma çıkışı gibi, elbette
Louis CAD

5
kotlin'den java'ya dönüştü. Ama ekstra kodu gösteriyor. hiç yazdığım veya duymadığım kod
Nauman Ash

20
bu seçenek etkin değil, gri renktedir. Nasıl etkinleştiririm.
Vikas Pandey

8
@VikasPandey, Decompile Kotlin to Javaşu anda yalnızca derlenmiş Kotlin sınıfları için etkindir .
Onik

39

Kotlin'i bayt kodlamak için derleyebilir, ardından bir Java sökücü kullanabilirsiniz.

Ayrıştırma IntelliJ Idea içinde veya FernFlower https://github.com/fesh0r/fernflower kullanılarak yapılabilir (teşekkürler @Jire)

Birkaç ay önce kontrol ettiğim hiçbir otomatik araç yoktu (ve bir AFAIK için plan yok)


2
Bir yan not olarak, Kotlin java derleyicisinin izin vermediği bazı şeylere izin verdiğinden, oluşturulan koddaki jeneriklerin derleyici uyarılarına neden olabileceğini unutmayın. Yine de bayt kodunda çalışıyor.
Jacob Zimmerman

@voddan Bence saf Java'da bir olasılık olmayan birleşik jeneriklere atıfta bulunuyor.
Jire

1
@Jire reified generics her zaman satır içi, bu yüzden Java normal sınıf referansları gibi görünüyor
voddan


4
IntelliJ IDEA 2016.2: Menü / Araçlar / Kotlin / Kotlin Bytecode'unu göster, ardından Decompile düğmesine tıklayın
Vadzim


7

Bir Kotlinkaynak dosyayı bir kaynak dosyaya dönüştürmek Javaiçin (Android Studio'da olduğunuzda):

  1. Basın Cmd- Shift- ABir Mac veya basın Ctrl- Shift- AWindows makinesinde.

  2. Aradığınız eylemi yazın: Kotlin Bytecodeve menüden seçim yapın Show Kotlin Bytecode.

resim açıklamasını buraya girin

  1. Panelin Decompileüst kısmındaki düğmesine basın Kotlin Bytecode.

resim açıklamasını buraya girin

  1. Şimdi Komşu bir sekmede Kotlin dosyası ile birlikte bir Decompiled Java dosyası alırsınız:

resim açıklamasını buraya girin


1
Teşekkürler bayım! Bu adamcağız AS normal araçları tekrar değiştirdi (Araçlar> Kotlin> ...).
CoolMind

5

Kotlin'i bayt koduna derledim ve sonra bunu Java'ya derledim. Kotlin derleyici ile derleme ve cfr ile derlemek .

Projem burada .

Bu, bunu derlememe izin veriyor:

package functionsiiiandiiilambdas.functions.p01tailiiirecursive

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

Buna:

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'in belirttiği gibi "Kotlin kaynağı -> Java bayt kodu -> Java kaynağı" şu ana kadar tek çözümdür.

Ama tercih ettiğim yoldan bahsetmek istiyorum: Android için Jadx decompiler kullanmak .

Kapaklar için kod üretir ve benim için sonuç kodu "temiz" sonra IntelliJ IDEA decompiler bir tane görmenizi sağlar .

Normalde yaptığım herhangi bir Kotlin sınıfının Java kaynak kodunu görmem gerektiğinde:

  • Apk oluştur: ./gradlew assembleDebug
  • Jadx GUI'yi kullanarak apk açın: jadx-gui ./app/build/outputs/apk/debug/app-debug.apk

Bu GUI temel IDE işlevselliği çalışır: sınıf arama, bildirime gitmek için tıklatın. vb.

Ayrıca tüm kaynak kodu kaydedilebilir ve daha sonra IntelliJ IDEA gibi diğer araçlar kullanılarak görüntülenebilir.


İyi olan, Homebrew aracılığıyla mevcut:brew install jadx
milosmns

2
  1. kotlin dosyasını android stüdyosunda aç
  2. araçlara git -> kotlin -> kotlin bayt kodu
  3. kotlin dosyanızın yanında açılan yeni pencerede, koda dönüştür düğmesine tıklayın. kotlin dosyanızın java eşdeğerini oluşturur.

2

Java ve Kotlin, Java Sanal Makinesi (JVM) üzerinde çalışır.

Bir Kotlin dosyasını Java dosyasına dönüştürmek iki adımdan oluşur, yani Kotlin kodunu JVM bayt koduna derlemek ve sonra bayt kodunu Java koduna dönüştürmek.

Kotlin kaynak dosyanızı Java kaynak dosyasına dönüştürme adımları:

  1. Kotlin projenizi Android Studio'da açın.
  2. Ardından Araçlar -> Kotlin -> Kotlin Bayt Kodunu Göster'e gidin.

resim açıklamasını buraya girin

  1. Kotin dosyanızın bayt kodunu alacaksınız.
  2. Java kodunuzu bayt kodundan almak için Şimdi Decompile düğmesine tıklayın
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.