由于kotlin和java一樣都是運(yùn)行在jvm虛擬機(jī)上,所以最終生成的都是遵循jvm規(guī)范的字節(jié)碼,因此可以通過(guò)反編譯kotlin生成的字節(jié)碼為java代碼來(lái)學(xué)習(xí)kotlin的原理。
1.data類的寫法
```
data class People(var name:String,var age:Int)
```
2.反編譯成java代碼后自動(dòng)生成了變量的get、set方法,equals方法,copy方法,component1(),component2(),hashCode()方法,如下:
```
public final class People {
@NotNull
private String name;
private int age;
@NotNull
public final String getName() {
return this.name;
}
public final void setName(@NotNull String var1) {
Intrinsics.checkParameterIsNotNull(var1,"");
this.name = var1;
}
public final int getAge() {
return this.age;
}
public final void setAge(intvar1) {
this.age = var1;
}
public People(@NotNull String name, int age) {
Intrinsics.checkParameterIsNotNull(name,"name");
super();
this.name = name;
this.age = age;
}
@NotNull
public final String component1() {
return this.name;
}
public final int component2() {
return this.age;
}
@NotNull
public final People copy(@NotNull String name, int age) {
Intrinsics.checkParameterIsNotNull(name,"name");
return new People(name,age);
}
// $FF: synthetic method
// $FF: bridge method
@NotNull
public static People copy$default(People var0,String var1, int var2, int var3,Object var4) {
if((var3 &1) !=0) {
var1 = var0.name;
}
if((var3 &2) !=0) {
var2 = var0.age;
}
return var0.copy(var1,var2);
}
public String toString() {
return "People(name="+this.name +", age="+this.age +")";
}
public int hashCode() {
return (this.name !=null?this.name.hashCode():0) *31+this.age;
}
public boolean equals(Object var1) {
if(this!= var1) {
if(var1 instanceof People) {
People var2 = (People)var1;
if(Intrinsics.areEqual(this.name,var2.name) &&this.age == var2.age) {
return true;
}
}
return false;
}else{
return true;
}
}
}
```
3.如果變量是val修飾,如data class People(var name:String,val age:Int),則只會(huì)為age變量生成get方法。
4.如果data類中需要定義常量,則常量的實(shí)際初始化階段是在構(gòu)造方法中,這點(diǎn)與java是不一樣的
kotlin代碼:
```
data class People(var name: String, var age: Int) {
val female=1
val male=2
}
```
反編譯后的java代碼(部分片段):
```
private final int female;
private final int male;
@NotNull
private String name;
private int age;
public People(@NotNull String name, int age) {
super();
this.name = name;
this.age = age;
this.female =1;
this.male =2;
}
```
這點(diǎn)要尤其注意,因?yàn)樵趈son的反序列化的過(guò)程中,如果調(diào)用的是無(wú)參構(gòu)造方法(gson的實(shí)現(xiàn)),那么常量是沒(méi)有進(jìn)行過(guò)賦值的