Convertendo um arquivo Kotlin em Java

Convertendo um arquivo Kotlin em Java

1. Visão geral

O Kotlin é conhecido por sua interoperabilidade com Java. Isso é possível, é claro, porque os dois estão em execução na Java Virtual Machine - em outras palavras, são compilados no mesmo bytecode.

 

image

Neste tutorial, exploraremos duas maneiras de realizar uma conversão de um arquivo Kotlin em um arquivo Java.

2. Por que converter Kotlin para Java?

Primeiro, vamos considerar alguns motivos pelos quais podemos querer fazer essa conversão:

  • Para entender o que realmente está acontecendo sob o capô

  • Para investigar problemas de desempenho

  • Para se livrar do Kotlin do nosso projeto

Conversion from Kotlin to Java requires two steps. Precisamos compilar o código Kotlin para o bytecode JVM. Então, precisamos descompilar o resultado no código Java.

No entanto,this process will never give us a properly working production code. Portanto, geralmente é necessário mais trabalho manual.

Nas próximas seções, veremos mais detalhadamente dois métodos para realizar a conversão.

3. Conversão usando ferramentas de linha de comando

Digamos que temos um arquivo Kotlin de nomeSample.kt com o seguinte conteúdo:

fun printEvenNumbers() {
    for (i in 0..10 step 2) {
        println(i)
    }
}

Primeiro, vamos compilar o código com o comando:

kotlinc Sample.kt

Como resultado, um arquivo com o nomeSampleKt.class será criado.

Agora, precisamosdecompile this file to Java.

Para fazer isso, usaremosFernFlower. Podemos obter ofernflower.jar baixando o projeto e executando a compilação do Gradle. Depois de termos o arquivo JAR, o comando a ser executado é:

java -jar fernflower.jar SampleKt.class .

Depois disso, veremos o arquivoSampleKt.java:

import kotlin.Metadata;
import kotlin.ranges.IntProgression;
import kotlin.ranges.IntRange;
import kotlin.ranges.RangesKt;

@Metadata(
   mv = {1, 1, 15},
   bv = {1, 0, 3},
   k = 2,
   d1 =
     {"\u0000\u0006\n\u0000\n\u0002\u0010\u0002\u001a\u0006\u0010\u0000\u001a\u00020\u0001"},
   d2 = {"printEvenNumbers", ""}
)
public final class SampleKt {
   public static final void printEvenNumbers() {
      byte var3 = 0;
      IntProgression var10000 = RangesKt.step((IntProgression)(new IntRange(var3, 10)), 2);
      int i = var10000.getFirst();
      int var1 = var10000.getLast();
      int var2 = var10000.getStep();
      if (var2 >= 0) {
         if (i > var1) {
            return;
         }
      } else if (i < var1) {
         return;
      }

      while(true) {
         boolean var4 = false;
         System.out.println(i);
         if (i == var1) {
            return;
         }

         i += var2;
      }
   }
}

Como podemos ver,the code is pretty complicated. Além disso, ainda possui dependências de idioma Kotlin. Temos um código que é inútil na produção devido à legibilidade e desempenho.

4. Conversão com IntelliJ IDEA

Com o IntelliJ IDEA, podemos executar as mesmas duas etapas de uma maneira mais conveniente.

Para compilar a fonte para o bytecode, vamos clicar emTools → Kotlin → Show Kotlin Bytecode no menu de contexto principal.

Uma nova placa aparecerá e poderemos ver o bytecode da JVM em uma forma legível por humanos:

image

A partir daí, simplesmenteclick the Decompile button para produzir um arquivo Java. Observe que o IntelliJ IDEA está usando o Fernflower nos bastidores, portanto, o arquivo Java resultante será idêntico ao mostrado acima.

5. Conclusão

Neste tutorial rápido, aprendemos duas maneiras de converter um arquivo Kotlin em Java.

Também discutimos alguns casos em que esse processo é útil e por que devemos evitá-lo no código de produção.