采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
一个简单得小demo:
反编译后:
问题:想知道红框里面 case 0执行得时候 那个$continuation对象是谁啊?是label20代码块里面新创建的还是 demo里面传进来的呀。。。。
从反编译的结果来看,关键在于传进来的是不是 <undefinedtype>,这个类型应该是反编译的时候不认识,实际上应该是一个真实存在的类型,你可以在字节码当中搜一下。
如果是,就强转,并且退出这个代码块(注意 break label20),实际的情况应该会走这个分支。
不是的话,则创建 ContinuationImpl。
编译器编译的结果经常会有变化,但Kotlin 源代码的语义不会变,更多信息同学自己可以分析一下。
需要提醒的是,反编译很多时候确实会找到答案,但这个方法的运用也要建立在自己对字节码以及 Kotlin 的语法设计有足够的理解的前提上,不然反而更加困惑。
如果配合上kotlin的baseContinuationImpl源码一步一步打断点调试,那么能分析出传进去的肯定是自己新创建的ContinuationImpl对象。就是看不太懂label20里面的代码逻辑。。。
有可能是调试用。不过我有个大胆的想法,可能是为了后面方便 Java 调用。至少现在 Swift 就已经可以直接调用 suspend 函数了,这种情况下传进来的肯定不是 ContinuationImpl。
登录后可查看更多问答,登录/注册
如果有一门语言可以取代Java,那么它一定是Kotlin。
1.5k 4
1.6k 1
403 1
241 20
1.4k 16