DEV Community

yuyabu
yuyabu

Posted on

Decompile and dissasemble JVM bytecode compiled from Kotlin source code

This is an experiment to try using javap (disassembler) and jad (decompiler) for this Kotlin code.

fun main (args: Array <String>) { println ("Hello, World!") } 

Code source
https://kotlinlang.org/docs/tutorials/command-line.html

Like other JVM languages, Kotlin is compiled into a class file executable as Java.
We can verify it because javap can display the mnemonic of JVM and decompile as java source code with jad.

Compile this.

kotlinc hello.kt -include-runtime -d hello.jar 

Extract jar and use javap, jad for hello.class

jar xf hello.jar 

Environment

macOS High Sierra 10

javap (Disassembler)

Preparation

It is unnecessary since it is in the JDK from the beginning

Execution

javap - c HelloKt.class 

Result

Compiled from "hello.kt" public final class HelloKt {   public static final void main (java.lang.String []);     Code:        0: aload_ 0        1: ldc # 9 // String args        3: invokestatic # 15 // Method kotlin / jvm / internal / Intrinsics.checkParameterIsNotNull: (Ljava / lang / Object; Ljava / lang / String;) V        6: ldc # 17 // String Hello, World!        8: astore_1        9: getstatic # 23 // Field java / lang / System.out: Ljava / io / PrintStream;       12: aload_1       13: invokevirtual # 29 // Method java / io / PrintStream.println: (Ljava / lang / Object;) V       16: return } 

jad (decompiler)

Preparation

How to introduce jad

brew tap caskroom / cask brew install caskroom / cask / jad 

Execution

 You can display the mnemonic as a comment with the -a option.

Command

$ jad -a HelloKt.class $ cat HelloKt.jad 
import java.io.PrintStream; import kotlin.jvm.internal.Intrinsics; public final class HelloKt {     public static final void main (String args [])     {         Intrinsics.checkParameterIsNotNull (args, "args");     // 0 0: aload_ 0     // 1 1: ldc 1 # 9 <String "args">     // 2 3: invokestatic # 15 <Method void Intrinsics.checkParameterIsNotNull (Object, String)>         String s = "Hello, World!";     // 3 6: ldc 1 # 17 <String "Hello, World!">     // 4 8: astore_ 1         System.out.println (s);     // 5 9: getstatic # 23 <Field PrintStream System.out>     // 6 12: aload - 1     // 7 13: invokevirtual # 29 <Method void PrintStream.println (Object)>     // 8 16: return     } } 

It was easy to introduce and analyze.
I will check how Kotlin specific functions are represented and converted as Java in the future.

Top comments (0)