DEV Community

yuyabu
yuyabu

Posted on

3 2

Decompiling Kotlin's program: Data class

If you are a Java programmer you may be tired of having troublesome implementation of setter, getter, hashcode, toString once.

Does not the IDE implement it automatically, or use a tool like lombok not to think deeply about this problem?

In Kotlin, there is a mechanism to automatically generate these troublesome declarations by attaching the qualifier "data" at the position of Class declaration

This is sample of Data Class (Person class).

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

This is how to use person class.

    var bob = Person ("Bob", 33)
    var bob 2 = 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)

Decompile with JAD

Decompile the person class and convert the automatically implemented code to Java

$ jad Person.class
Parsing Person.class ... Generating Person.jad
Could not fully decompile method hashCode

The method of hashcode could not be decompiled.
I'll check hashcode() at next post.

Decompiling result of java: Person class

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 component 1 ()
    {
        return name;
    }

    public final int component 2 ()
    {
        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 ()
    {
        append ("age ="). append (age). append (")"). toString (); return (new StringBuilder ()). append ("Person (name =
    }

    public int hashCode ()
    {
        name;
        if (name == null) goto _ L 2; else goto _ L 1
_L1:
        hashCode ();
          goto _ L 3
_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 instance of Person))
                    break label 0;
                Person person = (Person) obj;
                if (! Intrinsics.areEqual (name, person.name) || (age! = person.age))
                    break label 0;
            }
            return true;
        }
        return false;
    }

    private final String name;
    private final int age;
}

Now, we checked automatic generation of hashCode, equals, toString, copy, # copy methods.
Next time,I check hashcode's bytecode.

thank you for your reading.

Sentry image

Hands-on debugging session: instrument, monitor, and fix

Join Lazar for a hands-on session where you’ll build it, break it, debug it, and fix it. You’ll set up Sentry, track errors, use Session Replay and Tracing, and leverage some good ol’ AI to find and fix issues fast.

RSVP here →

Top comments (0)

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay