Рубрики
Без рубрики

Декомпилировать и дизассемблировать байт-код JVM, скомпилированный из исходного кода Kotlin

как дизассемблировать и декомпилировать для kotlin. Помеченный kotlin, java, jvm, байт-код.

Это эксперимент, чтобы попробовать использовать javap (дизассемблер) и jad (декомпилятор) для этого кода Kotlin.

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

Источник кода https://kotlinlang.org/docs/tutorials/command-line.html

Как и другие языки JVM, Kotlin компилируется в файл класса, исполняемый как Java. Мы можем проверить это, потому что java может отображать мнемонику JVM и декомпилировать как исходный код java с помощью jad.

Скомпилируйте это.

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

Извлеките jar и используйте javap, jad для hello.class

jar xf hello.jar

Маркос Хай Сьерра 10

Подготовка

В этом нет необходимости, так как он находится в JDK с самого начала

Исполнение

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
}

Подготовка

Как представить Джада

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

Исполнение

Вы можете отобразить мнемонику в виде комментария с помощью опции -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.

Оригинал: “https://dev.to/yuyabu/decompile-and-dissasemble-jvm-bytecode-compiled-from-kotlin-source-code-2cd9”