※本サイトで紹介している商品・サービス等の外部リンクには、アフィリエイト広告が含まれる場合があります。

Kotlin のバイトコードを表示、デコンパイル

2024年1月2日

概要

IntelliJ IDEA には、Kotlin のコードをバイトコードにコンパイルした結果を表示する機能、およびそのバイトコードをデコンパイルして Java で表示する機能があります。

インライン関数などコンパイラによって生成するバイトコードを見て意味ないとわかりにくい部分を理解するのに有用です。

方法

IntelliJ IDE で Kotlin のプロジェクトを作成し、コードを記述後に [ツール] メニュー – [Kotlin] – [Kotlin のバイトコードを表示] をクリックするだけです。

以下は、単に Hello World! を出力するプログラムのバイトコードを出力した例です。

fun main() {
    println("Hello World!")
}

右側に [Kotlin Bytecode] のドックが表示されます。

IntelliJ IDEA - [Kotlin Bytecode] ドック

このケースでされたバイトコードは以下です。

// ================MainKt.class =================
// class version 52.0 (52)
// access flags 0x31
public final class MainKt {


  // access flags 0x19
  public final static main()V
   L0
    LINENUMBER 2 L0
    LDC "Hello World!"
    ASTORE 0
   L1
    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
    ALOAD 0
    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/Object;)V
   L2
   L3
    LINENUMBER 3 L3
    RETURN
   L4
    MAXSTACK = 2
    MAXLOCALS = 1

  // access flags 0x1009
  public static synthetic main([Ljava/lang/String;)V
    INVOKESTATIC MainKt.main ()V
    RETURN
    MAXSTACK = 0
    MAXLOCALS = 1

  @Lkotlin/Metadata;(mv={1, 9, 0}, k=2, d1={"\u0000\u0008\n\u0000\n\u0002\u0010\u0002\n\u0000\u001a\u0006\u0010\u0000\u001a\u00020\u0001\u00a8\u0006\u0002"}, d2={"main", "", "HelloWorld"})
  // compiled from: Main.kt
}


// ================META-INF/HelloWorld.kotlin_module =================
         	        


 MainKt" * 

Java にデコンパイル

さらにここから Java にデコンパイルできます。
[Kotlin Bytecode] のドックの左上 [デコンパイル] をクリックするだけです。

ここでは、Main.kt のバイトコードを表示し、デコンパイルしたので [Main.decompiled.java] というファイルが作成、表示されます。

IntelliJ IDEA - [Kotlin Bytecode] - [デコンパイル]

表示された Java のコードは以下です。

import kotlin.Metadata;

@Metadata(
   mv = {1, 9, 0},
   k = 2,
   d1 = {"\u0000\b\n\u0000\n\u0002\u0010\u0002\n\u0000\u001a\u0006\u0010\u0000\u001a\u00020\u0001¨\u0006\u0002"},
   d2 = {"main", "", "HelloWorld"}
)
public final class MainKt {
   public static final void main() {
      String var0 = "Hello World!";
      System.out.println(var0);
   }

   // $FF: synthetic method
   public static void main(String[] var0) {
      main();
   }
}