DEV Community

yuyabu
yuyabu

Posted on

4 1

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)

Sentry image

Make it make sense

Only the context you need to fix your broken code with Sentry.

Start debugging →

👋 Kindness is contagious

Engage with a wealth of insights in this thoughtful article, cherished by the supportive DEV Community. Coders of every background are encouraged to bring their perspectives and bolster our collective wisdom.

A sincere “thank you” often brightens someone’s day—share yours in the comments below!

On DEV, the act of sharing knowledge eases our journey and forges stronger community ties. Found value in this? A quick thank-you to the author can make a world of difference.

Okay