遇到困难了呀,一直卡在这里,家人们帮帮我吧。。。

来源:12-5 案例:仿官方框架实现 runBlocking

慕前端9039556

2020-10-19

一个简单得小demo:

图片描述
反编译后:

图片描述
图片描述

问题:想知道红框里面 case 0执行得时候 那个$continuation对象是谁啊?是label20代码块里面新创建的还是 demo里面传进来的呀。。。。

写回答

1回答

bennyhuo

2020-10-20

从反编译的结果来看,关键在于传进来的是不是 <undefinedtype>,这个类型应该是反编译的时候不认识,实际上应该是一个真实存在的类型,你可以在字节码当中搜一下。

如果是,就强转,并且退出这个代码块(注意 break label20),实际的情况应该会走这个分支。

不是的话,则创建 ContinuationImpl。

编译器编译的结果经常会有变化,但Kotlin 源代码的语义不会变,更多信息同学自己可以分析一下。

需要提醒的是,反编译很多时候确实会找到答案,但这个方法的运用也要建立在自己对字节码以及 Kotlin 的语法设计有足够的理解的前提上,不然反而更加困惑。

1
2
bennyhuo
回复
慕前端9039556
有可能是调试用。不过我有个大胆的想法,可能是为了后面方便 Java 调用。至少现在 Swift 就已经可以直接调用 suspend 函数了,这种情况下传进来的肯定不是 ContinuationImpl。
2020-10-20
共2条回复

学会Kotlin 突破开发语言瓶颈

如果有一门语言可以取代Java,那么它一定是Kotlin。

1695 学习 · 447 问题

查看课程