[JAVA] Compilation inversée du programme Kotlin: classe de données

Si vous êtes un programmeur Java, vous en avez probablement assez d'implémenter une fois le fastidieux setter, getter, hashcode et toString.

L'EDI ne l'implémente-t-il pas automatiquement ou n'utilise-t-il pas des outils comme lombok pour éviter de réfléchir à ce problème?

Kotlin dispose d'un mécanisme pour générer automatiquement ces déclarations gênantes en ajoutant un modificateur appelé data lors de la déclaration d'une classe.

Classe de personne


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

Code qui utilise la classe Person


    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)

Compilation inversée avec JAD

Décompilez la classe person et convertissez le code implémenté automatiquement en Java

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

La méthode de hashcode n'a pas pu être compilée de manière inverse. C'est [Le comportement du code est résumé dans le blog](http://yuyubu.hatenablog.com/entry/2018/03/30/ Assemblage inversé au mystère de hashCode% 28% 29 généré par la classe de données de Kotlin) Veuillez donc le lire si vous êtes intéressé.

Résultat de la compilation inverse de la classe Person



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;
}

Nous avons pu confirmer la génération automatique de hashCode, equals, toString, copy et #copy.

Recommended Posts

Compilation inversée du programme Kotlin: classe de données
Assemblage inversé / fichier .class de compilation inverse compilé à partir de Kotlin
Classe Kotlin à envoyer aux développeurs Java
Comment décompiler un fichier de classe Java