kotlin的扩展看起来很神奇,可以随意给类添加方法。
先编译成byteCode,然后反编译成java,看看如果是java是如何实现。
Task.kt
class User(var name:String)
/**扩展函数**/
fun User.Print(){
print("用户名 $name")
}
fun main(arg:Array<String>){
var user = User("Runoob")
user.Print()
}
通过Android studio的工具Tools -> "Kotlin" -> "show kotlin byteCode"
然后就可以看到对应的byteCode,然后点击”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;
}
}
可以看到他是用了类似静态方法的原理去添加这个扩展。
参考文章:
- 扩展的语法以及注意事项:http://www.runoob.com/kotlin/kotlin-extensions.html
- 反编译kotlin代码看逻辑:https://juejin.im/post/5b499ff26fb9a04f8856c551
- kotlin和jvm的理解:https://kotlinexpertise.com/kotlin-byte-code-generation/
- 扩展的反编译以及使用内联函数优化扩展:https://juejin.im/post/5b499ff26fb9a04f8856c551
网友评论