Konvertere en Kotlin-fil til Java

1. Oversikt

Kotlin er kjent for sin interoperabilitet med Java. Dette er selvfølgelig mulig fordi de begge kjører på Java Virtual Machine - med andre ord, de er samlet til samme bytekode.

I denne opplæringen vil vi utforske to måter å utføre en konvertering fra en Kotlin-fil til en Java-fil.

2. Hvorfor konvertere Kotlin til Java?

La oss først se på noen få grunner til at vi kanskje vil gjøre en slik konvertering:

  • Å forstå hva som egentlig går under panseret
  • Å undersøke ytelsesproblemer
  • Å kvitte seg med Kotlin fra prosjektet vårt

Konvertering fra Kotlin til Java krever to trinn. Vi må kompilere Kotlin-koden til JVM-bytecode. Deretter må vi dekompilere resultatet til Java-koden.

Derimot, denne prosessen vil aldri gi oss en riktig fungerende produksjonskode. Derfor er det vanligvis behov for videre manuelt arbeid.

I de neste avsnittene vil vi se nærmere på to metoder for å utføre konverteringen.

3. Konvertering ved hjelp av kommandolinjeverktøy

La oss si at vi har et Kotlin-filnavn Sample.kt med følgende innhold:

morsom printEvenNumbers () {for (i i 0..10 trinn 2) {println (i)}}

La oss først kompilere koden med kommandoen:

kotlinc Sample.kt

Som et resultat, en fil med navnet EksempelKt.klasse vil bli opprettet.

Nå må vi dekompiler denne filen til Java.

For å gjøre dette, vil vi bruke FernFlower. Vi kan få fernflower.jar ved å laste ned prosjektet og kjøre Gradle-bygningen. Når vi har JAR-filen, er kommandoen å kjøre:

java -jar fernflower.jar SampleKt.-klasse.

Etter det ser vi filen SampleKt.java:

importere kotlin.Metadata; importere kotlin.ranges.IntProgression; importere kotlin.ranges.IntRange; importere 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 "," "}) offentlig sluttklasse SampleKt {offentlig statisk endelig ugyldig utskriftEvenNumbers () {byte var3 = 0; IntProgression var10000 = RangesKt.step ((IntProgression) (ny IntRange (var3, 10)), 2); int i = var10000.getFirst (); int var1 = var10000.getLast (); int var2 = var10000.getStep (); hvis (var2> = 0) {hvis (i> var1) {retur; }} annet hvis (i <var1) {return; } mens (sann) {boolsk var4 = falsk; System.out.println (i); hvis (i == var1) {retur; } i + = var2; }}}

Som vi kan se, koden er ganske komplisert. Videre har den fortsatt Kotlin-språkavhengigheter. Vi fikk et stykke kode som er ubrukelig i produksjonen på grunn av lesbarhet og ytelse.

4. Konvertering med IntelliJ IDEA

Med IntelliJ IDEA kan vi gjøre de samme to trinnene på en mer praktisk måte.

For å kompilere kilden til bytekode, la oss klikke Verktøy -> Kotlin -> Vis Kotlin Bytecode fra hovedmenyen.

Et nytt kort vises, og vi skal kunne se JVM bytecode i en lesbar form:

Derfra rett og slett Klikk på Dekompilere knapp for å produsere en Java-fil. Merk at IntelliJ IDEA bruker Fernflower under panseret, så den resulterende Java-filen vil være identisk med den som er vist ovenfor.

5. Konklusjon

I denne raske opplæringen har vi lært to måter å konvertere en Kotlin-fil til Java.

Vi diskuterte også noen få tilfeller der denne prosessen er nyttig, og hvorfor vi bør unngå den for produksjonskode.