Een Kotlin-bestand naar Java converteren

1. Overzicht

Kotlin staat bekend om zijn interoperabiliteit met Java. Dit is natuurlijk mogelijk omdat ze allebei op de Java Virtual Machine draaien - met andere woorden, ze zijn gecompileerd naar dezelfde bytecode.

In deze zelfstudie onderzoeken we twee manieren om een ​​conversie uit te voeren van een Kotlin-bestand naar een Java-bestand.

2. Waarom Kotlin naar Java converteren?

Laten we eerst een paar redenen bekijken waarom we een dergelijke conversie willen uitvoeren:

  • Om te begrijpen wat er werkelijk onder de motorkap gebeurt
  • Om prestatieproblemen te onderzoeken
  • Om Kotlin uit ons project te verwijderen

Conversie van Kotlin naar Java vereist twee stappen. We moeten de Kotlin-code compileren naar de JVM-bytecode. Vervolgens moeten we het resultaat decompileren naar de Java-code.

Echter, dit proces zal ons nooit een goed werkende productiecode opleveren. Daarom is meestal verder handmatig werk nodig.

In de volgende secties zullen we twee methoden voor het uitvoeren van de conversie nader bekijken.

3. Conversie met behulp van opdrachtregelhulpmiddelen

Laten we zeggen dat we een Kotlin-bestandsnaam hebben Sample.kt met de volgende inhoud:

fun printEvenNumbers () {voor (i in 0..10 stap 2) {println (i)}}

Laten we eerst de code compileren met het commando:

kotlinc Sample.kt

Het resultaat is een bestand met de naam SampleKt. Klasse zal gemaakt worden.

Nu moeten we decompileer dit bestand naar Java.

Om dit te doen, zullen we gebruiken FernFlower. We kunnen de fernflower.jar door het project te downloaden en de Gradle-build uit te voeren. Zodra we het JAR-bestand hebben, is het uit te voeren commando:

java -jar fernflower.jar SampleKt.class.

Daarna zullen we het bestand zien SampleKt.java:

kotlin.Metadata importeren; 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 "," "}) openbare laatste klasse SampleKt {openbare statische laatste ongeldige printEvenNumbers () {byte var3 = 0; IntProgression var10000 = RangesKt.step ((IntProgression) (nieuwe 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; }}}

Zoals we kunnen zien, de code is behoorlijk ingewikkeld. Bovendien heeft het nog steeds Kotlin-taalafhankelijkheden. We hebben een stukje code dat nutteloos is tijdens de productie vanwege de leesbaarheid en prestaties.

4. Conversie met IntelliJ IDEA

Met IntelliJ IDEA kunnen we dezelfde twee stappen op een gemakkelijkere manier uitvoeren.

Laten we klikken om de broncode naar bytecode te compileren Hulpmiddelen -> Kotlin -> Kotlin-bytecode weergeven vanuit het hoofdcontextmenu.

Er verschijnt een nieuwe kaart en we zouden de JVM-bytecode in een door mensen leesbare vorm moeten kunnen zien:

Van daaruit gaan we gewoon Klik op de Decompileren knop om een ​​Java-bestand te maken. Merk op dat IntelliJ IDEA Fernflower onder de motorkap gebruikt, dus het resulterende Java-bestand zal identiek zijn aan het hierboven getoonde.

5. Conclusie

In deze korte tutorial hebben we twee manieren geleerd om een ​​Kotlin-bestand naar Java te converteren.

We hebben ook een paar gevallen besproken waarin dit proces nuttig is en waarom we het zouden moeten vermijden voor productiecode.