kotlin的擴(kuò)展看起來(lái)很神奇,可以隨意給類添加方法。
先編譯成byteCode页藻,然后反編譯成java抛蚁,看看如果是java是如何實(shí)現(xiàn)。
Task.kt
class User(var name:String)
/**擴(kuò)展函數(shù)**/
fun User.Print(){
print("用戶名 $name")
}
fun main(arg:Array<String>){
var user = User("Runoob")
user.Print()
}
通過(guò)Android studio的工具Tools -> "Kotlin" -> "show kotlin byteCode"
然后就可以看到對(duì)應(yīng)的byteCode惕橙,然后點(diǎn)擊”Decompile“就能反編譯成java代碼,可以輔助理解他的原理
public final class TaskKt {
public static final void Print(@NotNull User $receiver) {
Intrinsics.checkParameterIsNotNull($receiver, "receiver$0");
String var1 = "用戶名 " + $receiver.getName();
System.out.print(var1);
}
public static final void main(@NotNull String[] arg) {
Intrinsics.checkParameterIsNotNull(arg, "arg");
User user = new User("Runoob");
Print(user);
}
}
// User.java
import kotlin.Metadata;
import kotlin.jvm.internal.Intrinsics;
import org.jetbrains.annotations.NotNull;
public final class User {
@NotNull
private String name;
@NotNull
public final String getName() {
return this.name;
}
public final void setName(@NotNull String var1) {
Intrinsics.checkParameterIsNotNull(var1, "<set-?>");
this.name = var1;
}
public User(@NotNull String name) {
Intrinsics.checkParameterIsNotNull(name, "name");
super();
this.name = name;
}
}
可以看到他是用了類似靜態(tài)方法的原理去添加這個(gè)擴(kuò)展钉跷。
參考文章:
- 擴(kuò)展的語(yǔ)法以及注意事項(xiàng):http://www.runoob.com/kotlin/kotlin-extensions.html
- 反編譯kotlin代碼看邏輯:https://juejin.im/post/5b499ff26fb9a04f8856c551
- kotlin和jvm的理解:https://kotlinexpertise.com/kotlin-byte-code-generation/
- 擴(kuò)展的反編譯以及使用內(nèi)聯(lián)函數(shù)優(yōu)化擴(kuò)展:https://juejin.im/post/5b499ff26fb9a04f8856c551