Kotlin反射
reflection
reflection又叫反射,Kotlin reflection不是对java反射的重写,因为java反射逻辑实现依靠jvm实现的,重写就意味着摒弃.
kotlin reflection是对于java反射的扩展
为什么需要扩展因为kotlin运行在jvm虚拟机上,kotlin真正独特的是它的编译器,它的海量的的语法特性都是通过编译器来提供支持的。
正是由于又有了这些语法特性使得kotlin成为了一门独特的语言,有很多地方他和java是类似的,但是又有很多地方是不相同的.
而jvm并不认识kotlin,对于kotlin的一些如data class,suspend,inline,sealed class显然是不能识别的,但是如果需要对这些类型进行特定的处理,那…显然是困难的
所以就有了kotlin reflection对于java反射的增强
如何引入kotlin reflectionkotlin reflection的支持需要引入一个依赖
123dependencies { implementation("org.jetbrains.k ...
Kotlin ::操作符
::操作符::操作符可以干嘛?或者说是用来干什么的?
它是用于指向一个已经定义的函数或者属性的.
引用函数::可引用的函数分为两类
top-level即顶层函数
成员函数
顶层函数12345678fun main() { val function = ::function function.invoke()}fun function() {}
产物这一看不知道的还以为是lambda(你说他是lambda也没啥问题)
实现原理首先还得是反编译啊
还是看字节码吧
123456789101112131415public final static main()V L0 #获取静态变量TestKt$main$function$1.INSTANCE GETSTATIC TestKt$main$function$1.INSTANCE : LTestKt$main$function$1; ASTORE 0 L1 ALOAD 0 #强转为kotlin的lambda类型接口 CHECKCAST kot ...
Kotlin高阶函数
高阶函数什么是高阶函数,所谓高阶函数。在数学和计算机科学中,高阶函数是至少满足下列一个条件的函数:
接受一个或多个函数作为输入
输出一个函数
kotlin语言需要在jvm上运行(但不是只能),而java是不支持高阶函数的,java没有高阶函数,只有方法.
kotlin在jvm上运行又是怎么实现的呢?
看下字节码不就会了
12345678fun function(block: (Int) -> Unit) { block(1)}fun main() { function { }}
123456789101112131415161718192021222324252627282930313233343536373839# 高阶函数最后被编译成了一个类也即是Fuction类# FunctionN表示输入参数的个数Function1表示输入参数为1个的函数类型.public final static function(Lkotlin/jvm/functions/Function1;)V # checkNo ...
Kotlin内联
inline我们都知道内联表示的是代码内联这个内联指的就是将代码直接抄过来
即将在调用处把代码copy过去
怎么看?
12345678910inline fun call(block: () -> Unit) { println("==I am Call ==") block()}fun testInline() { call { println("Hello World") }}
123456789101112131415161718192021222324252627282930313233343536373839404142public final static testInline()V L0 LINENUMBER 16 L0 L1 ICONST_0 ISTORE 0 L2 LINENUMBER 34 L2 LDC "==I am Call ==" !!!!!!!!!!!! ...
Kotlin泛型
泛型
泛型又叫参数化类型,可以理解是一种类型参数(一种表征类型的参数类型)
泛型主要起到的是规范作用,其行为主要是在编译期报错来避免一些潜在的类型安全问题
kotlin泛型按种类可分为以下3类
函数泛型
类泛型
接口泛型
真泛型类型reified
函数泛型作为函数参数传入123fun <T> get(t: T) { println(t.toString())}
字节码如下
1234567891011121314151617181920212223public final static get(Ljava/lang/Object;)V #这也就是著名的类型擦除,泛型类型最后会被会被编译成Object而没有真正生成具体的类 // annotable parameter count: 1 (visible) // annotable parameter count: 1 (invisible) L0 LINENUMBER 8 L0 #源代码行号 ALOAD 0 #局部变量表0位置的引用 ...
Kotlin延迟初始化
lateinit实现原理
lateinit就变量定义上于普通变量一致
lateinit是将变量的初始化延后,也就是说可以不立即对变量进行初始化,他具体的实现是通过对方法的get以及调用处进行值类型的判空处理
123456789101112fun main() { val test = Test() test.cur}class Test { lateinit var cur: String fun printCur() { println(cur) }}
就事论事分析main函数
1234567891011121314L0 LINENUMBER 8 L0 #源代码行号标记 NEW Test #new Test类的实例压入操作数栈 DUP #复制栈顶元素,方便后续invoke消耗 INVOKESPECIAL Test.<init> ()V #弹栈顶元素,初始化对象 ASTORE 0 ...
Kotlin可空类型
可空类型的实现原理
在字节码层面上可空类型没有做文章,String?和String其实是同一个类型
可空类型不同于java的普通类型有两点:
一是有编译器的限定,可空类型不能直接访问成员变量和成员方法(可空类型的访问要了用?.安全访问,要么使用!!强制访问)
二是可空类型的?.和!!以及?:会生成额外的字节码
可空类型的定义123val nullable1: String? = ""val nullable2: String? = nullval notNull: String = ""
对比字节码
nullable112LDC "" #将常量池的内容压入操作数栈ASTORE 0 #将操作数栈的栈顶元素弹入局部变量表index为0的位置
nullable212ACONST_NULL #将null压入操作数栈ASTORE 1 #将操作数栈的栈顶元素弹入局部变量表index为0的位置
notNull12LDC "" #将常量池内元素""压入操作数栈ASTOR ...
Kotlin尾递归
尾递归优化
尾递归就是虚伪的递归,他是一种类似于循环的执行流程
递归字节码123456var a = 0fun a() { println(a++) a()}
字节码如下
12345678910111213141516171819202122public final static a()V L0 LINENUMBER 15 L0 GETSTATIC TailrecTestKt.a : I DUP ISTORE 0 ICONST_1 IADD PUTSTATIC TailrecTestKt.a : I ILOAD 0 ISTORE 0 L1 GETSTATIC java/lang/System.out : Ljava/io/PrintStream; ILOAD 0 INVOKEVIRTUAL java/io/PrintStream.println (I)V L2 L3 LINENUMBER 16 L3 INVOKESTATIC TailrecTestKt ...
ViewModel
viewmodel
ViewModel作为Android的元老级别的内容,你不知道就out了
ViewModel的实现主要就是能在activity配置发生变化的时候还能保存值。
保存策略突破点
viewModel的获取
1val vm = ViewModelProvider(this).get<LiveDataEventVM>()
总是有这样一段代码
12345678public constructor( owner: ViewModelStoreOwner) : this(owner.viewModelStore, defaultFactory(owner), defaultCreationExtras(owner))public constructor(owner: ViewModelStoreOwner, factory: Factory) : this( owner.viewModelStore, factory, defaultCreationExtras(owner)
获取viewmodel的Store owner
123456 ...
Lifecycle
LifecycleLifecycle不是什么奇怪的的东西,就是一个Lifecycle-aware components
lifecycle中有三个东西,viewmodel,livedata,lifecycle,本文着重分析lifecycle。
即
1androidx.lifecycle:lifecycle-runtime
具体分析
项目依赖结构
由于库的代码不多,就先直接从库的源码开始。
少的可怜的runtime
一共就4个类
LifecycleRegistry
An implementation of Lifecycle that can handle multiple observers.It is used by Fragments and Support Library Activities. You can also directly use it if you have a custom LifecycleOwner.
Lifecycle的实现类,用于处理监听者。
它主要是用于Fragment和一些Activity,我们也可以直接使用它,如果我们有自 ...