[JAVA] Reverse Assemble / Reverse Compile .Klassendatei aus Kotlin kompiliert

Dies ist ein Experiment mit javap (Reverse Assembler) und jad (Reverse Compiler) für Kotlin-Code.

hello.kt


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

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

Kotlin wird wie jede andere JVM-Sprache in eine Klassendatei kompiliert, die als Java ausgeführt werden kann. Ich habe versucht, dies zu überprüfen, da es möglich ist, die JVM-Mnemonik mit javap anzuzeigen und sie mit jad als Java-Quellcode rückwärts zu kompilieren.

kompilieren


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

Erweitern Sie jar und verwenden Sie javap, jad für hello.class

jar xf hello.jar

Umgebung

macOS High Sierra 10

javap (Reverse Assembler)

Vorbereitung

Nicht erforderlich, da es von Anfang an im JDK enthalten ist

Lauf

Befehl


javap -c HelloKt.class

Ergebnis


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 (Reverse Compiler)

Vorbereitung

So installieren Sie jad

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

Referenzierte Website http://inarizuuuushi.hatenablog.com/entry/2017/05/09/231600

Lauf

Mit der Option -a können Sie Mnemonics als Kommentare anzeigen.

Befehl


$ jad  -a HelloKt.class 
$ cat HelloKt.jad 

python


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:ldc1            #9   <String "args">
    //    2    3:invokestatic    #15  <Method void Intrinsics.checkParameterIsNotNull(Object, String)>
        String s = "Hello, World!";
    //    3    6:ldc1            #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          
    }
}

Es war ziemlich einfach einzuführen und zu analysieren. In Zukunft möchte ich überprüfen, wie Kotlin-spezifische Funktionen als Java ausgedrückt und konvertiert werden.

Recommended Posts

Reverse Assemble / Reverse Compile .Klassendatei aus Kotlin kompiliert
Reverse-Kompilierung von Klassendateien
Reverse Kompilierung des Kotlin-Programms: Datenklasse
Holen Sie sich TypeElement und TypeMirror von Class
So zerlegen Sie eine Java-Klassendatei
So dekompilieren Sie eine Java-Klassendatei
[Kotlin] Drei Möglichkeiten, um Klasse von KClass zu bekommen
Klasse und Modell
[Java] Mit Apathce Tika Metadaten aus Dateien abrufen und Breite und Höhe von Bildern / Videos aus Metadaten abrufen [Kotlin]
Java-Sprache aus der Sicht von Kotlin und C #
Schreiben Sie eine Klasse in Kotlin und nennen Sie sie in Java