Como converter um arquivo de origem Kotlin em um arquivo de origem Java


389

Eu tenho um arquivo de origem Kotlin, mas quero traduzi-lo para Java.

Como posso converter Kotlin para fonte Java?


10
Tenho certeza de que nenhuma ferramenta automatizada foi criada para isso ainda. Você pode construí-lo primeiro!
Eric Cochran

7
É muito provável que você acabe com uma classe Java feia e insustentável que não será executada se você não tiver a biblioteca padrão Kotlin no caminho de classe. Qual é o objetivo?
yole 23/01

3
Considere o tradutor j2objC. Seria ótimo se você pudesse fazer Kotlin -> Java -> ObjC
Patrick

3
O objetivo do botão "Descompilar" é ajudar as pessoas a entender como a compilação Kotlin funciona. O código Java que gera não se destina para uso como código de produção real (e é muito mal adequado para isso - para começar, nem sempre compilar ...)
yole

2
@ yole, que tal alguém que não conhece o Kotlin ou tem tempo para aprendê-lo e possui um código de exemplo nessa linguagem com algumas funcionalidades que eles precisam entender para que o código Java funcione?
Michael

Respostas:


400

Como o @Vadzim disse, no IntelliJ ou no Android Studio, basta fazer o seguinte para obter o código java do kotlin:

  1. Menu > Tools > Kotlin > Show Kotlin Bytecode
  2. Clique no Decompilebotão
  3. Copie o código java

Atualizar:

Com uma versão recente (1.2+) do plug-in Kotlin, você também pode fazer diretamente Menu > Tools > Kotlin -> Decompile Kotlin to Java.


60
A saída de Java não é feia?
Pacerier 17/06/19

20
@Pacerier Assim como a maioria das saídas decompiling, é, claro
Louis CAD

5
convertido de kotlin para java. Mas está mostrando código extra. o código que eu nunca escrevi ou ouvi
Nauman Ash

20
essa opção não está ativada, é colorida em cinza. Como faço para habilitá-lo.
Vikas Pandey

8
@VikasPandey, Decompile Kotlin to Javaatualmente está ativado apenas para as classes Kotlin compiladas .
Onik 28/09/18

39

Você pode compilar o Kotlin no bytecode e depois usar um desmontador de Java.

A descompilação pode ser feita dentro do IntelliJ Idea ou usando o FernFlower https://github.com/fesh0r/fernflower (obrigado @Jire)

Não havia ferramenta automatizada, como verifiquei há alguns meses (e não há planos para um AFAIK)


2
Como uma observação lateral, esteja ciente de que os genéricos no código gerado podem causar avisos ao compilador, pois o Kotlin permite algumas coisas que o compilador java não. Ainda funciona em código de bytes.
Jacob Zimmerman

@ voddan Acho que ele está se referindo a genéricos reificados, que não são uma possibilidade em Java puro.
Jire

11
@Jire reificado genéricos são sempre embutido, então a partir Java eles se parecem com referências de classe normais
voddan

3
Isto é o que eu estou falando sobre stackoverflow.com/questions/34762029/…
Jacob Zimmerman

4
IntelliJ IDEA 2.016,2: Menu / Ferramentas / Kotlin / Show Kotlin Bytecode, em seguida, clique no botão Decompile
Vadzim


7

Para converter um Kotlinarquivo de origem em um Javaarquivo de origem, você precisa (quando estiver no Android Studio):

  1. Pressione Cmd- Shift- Aem um Mac ou Ctrl- Shift- Aem uma máquina Windows.

  2. Digite a ação que você está procurando: Kotlin Bytecodee escolha Show Kotlin Bytecodeno menu.

insira a descrição da imagem aqui

  1. Pressione o Decompilebotão na parte superior do Kotlin Bytecodepainel.

insira a descrição da imagem aqui

  1. Agora você obtém um arquivo Java descompilado junto com o arquivo Kotlin em uma guia adjacente:

insira a descrição da imagem aqui


11
Obrigado senhor! Este AS de buggy mudou novamente as ferramentas normais (Ferramentas> Kotlin> ...).
CoolMind

5

Compilei o Kotlin para código de bytes e depois o descompile para Java. Eu compilar com o compilador Kotlin e descompilar com cfr .

Meu projeto está aqui .

Isso me permite compilar isso:

package functionsiiiandiiilambdas.functions.p01tailiiirecursive

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

Para isso:

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

Como @ louis-cad mencionou "Fonte Kotlin -> código de bytes do Java -> fonte Java" é a única solução até agora.

Mas eu gostaria de mencionar o caminho, que eu prefiro: usando o descompilador Jadx para Android .

Ele permite ver o código gerado para os fechamentos e, quanto a mim, o código resultante é "mais limpo" do que o do descompilador IntelliJ IDEA.

Normalmente, quando preciso ver o código-fonte Java de qualquer classe Kotlin que faço:

  • Gerar apk: ./gradlew assembleDebug
  • Abra o apk usando Jadx GUI: jadx-gui ./app/build/outputs/apk/debug/app-debug.apk

Nesta GUI, a funcionalidade básica do IDE funciona: pesquisa de classe, clique para ir para a declaração. etc.

Além disso, todo o código-fonte pode ser salvo e visualizado usando outras ferramentas como o IntelliJ IDEA.


Bom, está disponível no Homebrew:brew install jadx
milosmns 15/09/19

2
  1. abrir arquivo kotlin no android studio
  2. vá para ferramentas -> kotlin -> kotlin bytecode
  3. na nova janela que se abre ao lado do arquivo kotlin, clique no botão descompilar. ele criará o equivalente java do seu arquivo kotlin.

2

Java e Kotlin são executados na Java Virtual Machine (JVM).

Converter um arquivo Kotlin em arquivo Java envolve duas etapas, ou seja, compilar o código Kotlin no bytecode da JVM e, em seguida, descompilar o bytecode no código Java.

Etapas para converter seu arquivo de origem Kotlin em arquivo de origem Java:

  1. Abra seu projeto Kotlin no Android Studio.
  2. Em seguida, navegue para Ferramentas -> Kotlin -> Mostrar Bytecode do Kotlin.

insira a descrição da imagem aqui

  1. Você receberá o bytecode do seu arquivo Kotin.
  2. Agora clique no botão Decompile para obter seu código Java do bytecode
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.