反编译Kotlin的程序:数据类

如果您是Java程序员,可能会厌烦一次执行setter,getter,hashcode和toString的麻烦。

IDE不会自动实现它,还是不使用lombok之类的工具来深入思考这个问题?

在Kotlin中,有一种机制可以通过在类声明的位置附加限定符“数据”来自动生成这些麻烦的声明

这是数据类(人员类)的示例。

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

这是使用人类的方法。

    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

反编译人员类并将自动实现的代码转换为Java

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

哈希码的方法无法反编译。 我会检查哈希码()在下一篇文章中。

Java的反编译结果: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 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;
}

现在,我们检查了hashCode,equals,toString,copy,#copy方法的自动生成。 下次,我检查哈希码的字节码。

感谢您的阅读。

from: https://dev.to//yuyabu/decompiling-kotlin-s-program-data-class-4lc6

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值