Conversion d'un fichier Kotlin en Java

1. Vue d'ensemble

Kotlin est bien connu pour son interopérabilité avec Java. Ceci est bien sûr possible car ils sont tous deux exécutés sur la machine virtuelle Java - en d'autres termes, ils sont compilés avec le même bytecode.

Dans ce didacticiel, nous allons explorer deux façons d'effectuer une conversion d'un fichier Kotlin en un fichier Java.

2. Pourquoi convertir Kotlin en Java?

Tout d'abord, examinons quelques raisons pour lesquelles nous pouvons vouloir faire une telle conversion:

  • Pour comprendre ce qui se passe vraiment sous le capot
  • Pour enquêter sur les problèmes de performances
  • Pour se débarrasser de Kotlin de notre projet

La conversion de Kotlin vers Java nécessite deux étapes. Nous devons compiler le code Kotlin vers le bytecode JVM. Ensuite, nous devons décompiler le résultat en code Java.

Cependant, ce processus ne nous donnera jamais un code de production fonctionnant correctement . Par conséquent, un travail manuel supplémentaire est généralement nécessaire.

Dans les sections suivantes, nous examinerons de plus près deux méthodes pour effectuer la conversion.

3. Conversion à l'aide des outils de ligne de commande

Disons que nous avons un nom de fichier Kotlin Sample.kt avec le contenu suivant:

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

Tout d'abord, compilons le code avec la commande:

kotlinc Sample.kt

En conséquence, un fichier avec le nom SampleKt.class sera créé.

Maintenant, nous devons décompiler ce fichier en Java .

Pour ce faire, nous utiliserons FernFlower . Nous pouvons obtenir le fernflower.jar en téléchargeant le projet et en exécutant la version Gradle. Une fois que nous avons le fichier JAR, la commande à exécuter est:

java -jar fernflower.jar SampleKt.class .

Après cela, nous verrons le fichier SampleKt.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; } } }

Comme on peut le voir, le code est assez compliqué . De plus, il a toujours des dépendances de langage Kotlin. Nous avons un morceau de code qui est inutile en production en raison de sa lisibilité et de ses performances.

4. Conversion avec IntelliJ IDEA

Avec IntelliJ IDEA, nous pouvons effectuer les deux mêmes étapes de manière plus pratique.

Pour compiler la source en bytecode, cliquons sur Tools -> Kotlin -> Show Kotlin Bytecode dans le menu contextuel principal.

Une nouvelle carte apparaîtra et nous devrions être en mesure de voir le bytecode JVM sous une forme lisible par l'homme:

De là, nous cliquons simplement sur le bouton Décompiler pour produire un fichier Java. Notez qu'IntelliJ IDEA utilise Fernflower sous le capot, le fichier Java résultant sera donc identique à celui illustré ci-dessus.

5. Conclusion

Dans ce rapide didacticiel, nous avons appris deux façons de convertir un fichier Kotlin en Java.

Nous avons également discuté de quelques cas où ce processus est utile et pourquoi nous devrions l'éviter pour le code de production.