Come convertire un file sorgente Kotlin in un file sorgente Java


389

Ho un file sorgente di Kotlin, ma voglio tradurlo in Java.

Come posso convertire Kotlin in sorgente Java?


10
Sono abbastanza sicuro che non sia stato ancora creato uno strumento automatico per questo. Puoi costruirlo prima!
Eric Cochran,

7
È molto probabile che finirai con una brutta e non mantenibile classe Java che non verrà eseguita se non hai la libreria standard Kotlin nel percorso di classe. Qual e il punto?
yole

3
Considera il traduttore j2objC. Sarebbe bello se potessi fare kotlin -> Java -> objC
Patrick

3
L'obiettivo del pulsante "Decompila" è aiutare le persone a capire come funziona la compilation di Kotlin. Il codice Java che genera non è destinato all'uso come codice di produzione effettivo (ed è abbastanza scarsamente adatto a quello - per cominciare, non sempre si compila ...)
yole

2
@yole che ne dici di qualcuno che non conosce Kotlin o non ha il tempo di impararlo e ha un codice di esempio in quella lingua che ha alcune funzionalità che devono capire per far funzionare il proprio codice Java?
Michael

Risposte:


400

Come ha detto @Vadzim, in IntelliJ o Android Studio, devi solo fare quanto segue per ottenere il codice java da kotlin:

  1. Menu > Tools > Kotlin > Show Kotlin Bytecode
  2. Fare clic sul Decompilepulsante
  3. Copia il codice java

Aggiornare:

Con una versione recente (1.2+) del plugin Kotlin puoi anche farlo direttamente Menu > Tools > Kotlin -> Decompile Kotlin to Java.


60
L'output di Java non è brutto?
Pacerier,

20
@Pacerier Proprio come la maggior parte delle uscite di decompilazione, è, ovviamente
Louis CAD

5
convertito da kotlin a java. Ma mostra un codice extra. il codice che non ho nemmeno mai scritto o sentito
Nauman Ash,

20
tale opzione non è abilitata, è di colore grigio. Come lo abilito.
Vikas Pandey,

8
@VikasPandey, Decompile Kotlin to Javaattualmente è abilitato solo per le classi Kotlin compilate .
Onik,

39

Puoi compilare Kotlin in bytecode, quindi utilizzare un disassemblatore Java.

La decompilazione può essere eseguita all'interno di IntelliJ Idea o utilizzando FernFlower https://github.com/fesh0r/fernflower (grazie @Jire)

Non c'erano strumenti automatici come ho verificato un paio di mesi fa (e non ci sono piani per un AFAIK)


2
Come nota a margine, tenere presente che i generici nel codice generato possono causare avvisi del compilatore, poiché Kotlin consente alcune cose che il compilatore java non fa. Funziona comunque con il codice byte.
Jacob Zimmerman,

@voddan Penso che si riferisca ai generici reificati, che non sono una possibilità nella pura Java.
Jire,

1
I generici reificati di @Jire sono sempre integrati, quindi da Java sembrano normali riferimenti di classe
voddan

3
Questo è ciò di cui sto parlando di stackoverflow.com/questions/34762029/…
Jacob Zimmerman

4
IntelliJ IDEA 2016.2: Menu / Strumenti / Kotlin / Mostra codice byte Kotlin, quindi fare clic sul pulsante Decompila
Vadzim


7

Per convertire un Kotlinfile sorgente in un Javafile sorgente necessario (quando si è in Android Studio):

  1. Premere Cmd- Shift- Asu un Mac o premere Ctrl- Shift- Asu un computer Windows.

  2. Digita l'azione che stai cercando: Kotlin Bytecodee scegli Show Kotlin Bytecodedal menu.

inserisci qui la descrizione dell'immagine

  1. Premere il Decompilepulsante nella parte superiore del Kotlin Bytecodepannello.

inserisci qui la descrizione dell'immagine

  1. Ora ottieni un file Java decompilato insieme al file Kotlin in una scheda adiacente:

inserisci qui la descrizione dell'immagine


1
Grazie Signore! Questo buggy AS ha nuovamente cambiato gli strumenti normali (Strumenti> Kotlin> ...).
CoolMind,

5

Compilo Kotlin in codice byte e poi decompilalo in Java. Compilare con il compilatore Kotlin e decompilare con cfr .

Il mio progetto è qui .

Questo mi permette di compilare questo:

package functionsiiiandiiilambdas.functions.p01tailiiirecursive

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

A questo:

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

Come ha menzionato @ louis-cad "Fonte Kotlin -> Codice byte Java -> Fonte Java" è l'unica soluzione finora.

Ma vorrei menzionare il modo in cui preferisco: usare il decompilatore Jadx per Android .

Permette di vedere il codice generato per le chiusure e, per quanto mi riguarda, il codice risultante è "più pulito" di quello del decompilatore IDEA di IntelliJ.

Normalmente quando ho bisogno di vedere il codice sorgente Java di qualsiasi classe Kotlin lo faccio:

  • Genera apk: ./gradlew assembleDebug
  • Apri l'apk usando la GUI di Jadx: jadx-gui ./app/build/outputs/apk/debug/app-debug.apk

In questa GUI la funzionalità IDE di base funziona: ricerca per classe, fare clic per andare alla dichiarazione. eccetera.

Inoltre, è possibile salvare e visualizzare tutto il codice sorgente utilizzando altri strumenti come IntelliJ IDEA.


Bene, è disponibile tramite Homebrew:brew install jadx
milosmns,

2
  1. apri il file kotlin in Android Studio
  2. vai su strumenti -> kotlin -> bytecode kotlin
  3. nella nuova finestra che si apre accanto al tuo file kotlin, fai clic sul pulsante di decompilazione. creerà l'equivalente Java del tuo file kotlin.

2

Java e Kotlin vengono eseguiti su Java Virtual Machine (JVM).

La conversione di un file Kotlin in file Java comporta due passaggi, ovvero la compilazione del codice Kotlin nel bytecode JVM e quindi la decompilazione del bytecode nel codice Java.

I passaggi per convertire il file sorgente Kotlin in file sorgente Java:

  1. Apri il tuo progetto Kotlin in Android Studio.
  2. Quindi vai su Strumenti -> Kotlin -> Mostra bytecode Kotlin.

inserisci qui la descrizione dell'immagine

  1. Otterrai il bytecode del tuo file Kotin.
  2. Ora fai clic sul pulsante Decompila per ottenere il codice Java dal bytecode
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.