从Kotlin源代码反编译和解散JVM字节码

这是尝试为此Kotlin代码使用javap(反汇编程序)和jad(反编译器)的实验。

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

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

像其他JVM语言一样,Kotlin被编译为可作为Java执行的类文件。 我们可以验证它,因为javap可以显示JVM的助记符并使用jad作为Java源代码反编译。

编译这个。

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

提取jar并将javap,jad用于hello.class

jar xf hello.jar

Environment

macOS High Sierra 10

javap (Disassembler)

Preparation

不必要,因为它从一开始就在JDK中

Execution

javap - c HelloKt.class

结果

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

如何介绍贾德

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

Execution

您可以使用-a选项将助记符显示为注释。

命令

$ 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 
    // 2 3: invokestatic # 15 
        String s = "Hello, World!";
    // 3 6: ldc 1 # 17 
    // 4 8: astore_ 1
        System.out.println (s);
    // 5 9: getstatic # 23 
    // 6 12: aload - 1
    // 7 13: invokevirtual # 29 
    // 8 16: return
    }
}

易于介绍和分析。 以后,我将检查如何将Kotlin特定的函数表示为Java。

from: https://dev.to//yuyabu/decompile-and-dissasemble-jvm-bytecode-compiled-from-kotlin-source-code-2cd9

你可能感兴趣的:(从Kotlin源代码反编译和解散JVM字节码)