Kotlin のバイトコードを表示、デコンパイル
Contents
概要
IntelliJ IDEA には、Kotlin のコードをバイトコードにコンパイルした結果を表示する機能、およびそのバイトコードをデコンパイルして Java で表示する機能があります。
インライン関数などコンパイラによって生成するバイトコードを見て意味ないとわかりにくい部分を理解するのに有用です。
方法
IntelliJ IDE で Kotlin のプロジェクトを作成し、コードを記述後に [ツール] メニュー – [Kotlin] – [Kotlin のバイトコードを表示] をクリックするだけです。
以下は、単に Hello World! を出力するプログラムのバイトコードを出力した例です。
fun main() { println("Hello World!") }
右側に [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] というファイルが作成、表示されます。
表示された 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(); } }