Konvertering af en Kotlin-fil til Java

1. Oversigt

Kotlin er kendt for sin interoperabilitet med Java. Dette er naturligvis muligt, fordi de begge kører på Java Virtual Machine - med andre ord, de er samlet til den samme bytecode.

I denne vejledning undersøger vi to måder at udføre en konvertering fra en Kotlin-fil til en Java-fil.

2. Hvorfor konvertere Kotlin til Java?

Lad os først overveje et par grunde til, at vi måske vil foretage en sådan konvertering:

  • At forstå, hvad der virkelig går under emhætten
  • At undersøge præstationsproblemer
  • For at slippe af med Kotlin fra vores projekt

Konvertering fra Kotlin til Java kræver to trin. Vi har brug for at kompilere Kotlin-koden til JVM-bytecode. Derefter skal vi dekompilere resultatet til Java-koden.

Imidlertid, denne proces vil aldrig give os en korrekt fungerende produktionskode. Derfor er der normalt behov for yderligere manuelt arbejde.

I de næste sektioner vil vi se nærmere på to metoder til udførelse af konverteringen.

3. Konvertering ved hjælp af kommandolinjeværktøjer

Lad os sige, at vi har et Kotlin-filnavn Sample.kt med følgende indhold:

sjov printEvenNumbers () {for (i i 0..10 trin 2) {println (i)}}

Lad os først kompilere koden med kommandoen:

kotlinc Sample.kt

Som et resultat en fil med navnet SampleKt.-klasse vil blive oprettet.

Nu skal vi dekompiler denne fil til Java.

For at gøre dette bruger vi FernFlower. Vi kan få fernflower.jar ved at downloade projektet og køre Gradle-build. Når vi har JAR-filen, er kommandoen, der skal køres:

java -jar fernflower.jar SampleKt.-klasse.

Derefter ser vi filen SampleKt.java:

import kotlin.Metadata; import kotlin.ranges.IntProgression; importere 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 "," "}) offentlig endelig klasse SampleKt {offentlig statisk endelig ugyldig printEvenNumbers () {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) {return; }} ellers hvis (i <var1) {return; } mens (sand) {boolsk var4 = falsk; System.out.println (i); hvis (i == var1) {return; } i + = var2; }}}

Som vi kan se, koden er ret kompliceret. Desuden har det stadig Kotlin-sprogafhængigheder. Vi fik et stykke kode, der er ubrugeligt i produktionen på grund af læsbarhed og ydeevne.

4. Konvertering med IntelliJ IDEA

Med IntelliJ IDEA kan vi gøre de samme to trin på en mere bekvem måde.

Lad os klikke på for at kompilere kilden til bytekode Værktøjer -> Kotlin -> Vis Kotlin Bytecode fra hovedkontekstmenuen.

Et nyt kort vises, og vi skal kunne se JVM bytecode i en menneskelig læsbar form:

Derfra, vi simpelthen klik på Dekompilere knap at producere en Java-fil. Bemærk, at IntelliJ IDEA bruger Fernflower under hætten, så den resulterende Java-fil vil være identisk med den, der er vist ovenfor.

5. Konklusion

I denne hurtige vejledning har vi lært to måder at konvertere en Kotlin-fil til Java.

Vi diskuterede også et par tilfælde, hvor denne proces er nyttig, og hvorfor vi skulle undgå den for produktionskode.