[JAVA] Reverse Kompilierung des Kotlin-Programms: Datenklasse

Wenn Sie ein Java-Programmierer sind, haben Sie es wahrscheinlich satt, den mühsamen Setter, Getter, Hashcode und toString einmal zu implementieren.

Implementiert die IDE es nicht automatisch oder verwendet sie Tools wie Lombok, um nicht über dieses Problem nachzudenken?

Kotlin verfügt über einen Mechanismus zum automatischen Generieren dieser problematischen Deklarationen, indem beim Deklarieren einer Klasse ein Modifikator namens data hinzugefügt wird.

Personenklasse


data class Person(val name:String, val age: Int)

``


    var bob =  Person("Bob",33)
    var bob2 = Person("Bob",33)
    println(bob===bob2)//false
    println(bob==bob2)//true
    println(bob.equals(bob2))//true
    println(bob.hashCode())//2075948
    println(bob.toString())//Person(name=Bob, age=33)

Reverse Compilation mit JAD

Dekompilieren Sie die Personenklasse und konvertieren Sie den automatisch implementierten Code in Java

$ jad Person.class 
Parsing Person.class... Generating Person.jad
Couldn't fully decompile method hashCode

Die Hashcode-Methode konnte nicht umgekehrt kompiliert werden. Dies ist [Das Codeverhalten ist im Blog zusammengefasst](http://yuyubu.hatenablog.com/entry/2018/03/30/ Reverse Assembly zum Geheimnis von HashCode% 28% 29, das von Kotlins Datenklasse generiert wurde) Bitte lesen Sie es, wenn Sie interessiert sind.

Umgekehrtes Kompilierungsergebnis der Personenklasse



import kotlin.jvm.internal.Intrinsics;

public final class Person
{

    public final String getName()
    {
        return name;
    }

    public final int getAge()
    {
        return age;
    }

    public Person(String name, int age)
    {
        Intrinsics.checkParameterIsNotNull(name, "name");
        super();
        this.name = name;
        this.age = age;
    }

    public final String component1()
    {
        return name;
    }

    public final int component2()
    {
        return age;
    }

    public final Person copy(String name, int age)
    {
        Intrinsics.checkParameterIsNotNull(name, "name");
        return new Person(name, age);
    }

    public static volatile Person copy$default(Person person, String s, int i, int j, Object obj)
    {
        if((j & 1) != 0)
            s = person.name;
        if((j & 2) != 0)
            i = person.age;
        return person.copy(s, i);
    }

    public String toString()
    {
        return (new StringBuilder()).append("Person(name=").append(name).append(", age=").append(age).append(")").toString();
    }

    public int hashCode()
    {
        name;
        if(name == null) goto _L2; else goto _L1
_L1:
        hashCode();
          goto _L3
_L2:
        JVM INSTR pop ;
        false;
_L3:
        31;
        JVM INSTR imul ;
        age;
        JVM INSTR iadd ;
        return;
    }

    public boolean equals(Object obj)
    {
label0:
        {
            if(this != obj)
            {
                if(!(obj instanceof Person))
                    break label0;
                Person person = (Person)obj;
                if(!Intrinsics.areEqual(name, person.name) || (age != person.age))
                    break label0;
            }
            return true;
        }
        return false;
    }

    private final String name;
    private final int age;
}

Wir konnten die automatische Generierung von hashCode, equals, toString, copy und #copy bestätigen.

Recommended Posts

Reverse Kompilierung des Kotlin-Programms: Datenklasse
Reverse Assemble / Reverse Compile .Klassendatei aus Kotlin kompiliert
Kotlin-Klasse zum Senden an Java-Entwickler
So dekompilieren Sie eine Java-Klassendatei