请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

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

一个简单得小demo:

图片描述
反编译后:

图片描述
图片描述

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

正在回答 回答被采纳积分+3

1回答

bennyhuo 2020-10-20 10:53:43

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

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

不是的话,则创建 ContinuationImpl。

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

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

1 回复 有任何疑惑可以回复我~
  • 提问者 慕前端9039556 #1
    如果配合上kotlin的baseContinuationImpl源码一步一步打断点调试,那么能分析出传进去的肯定是自己新创建的ContinuationImpl对象。就是看不太懂label20里面的代码逻辑。。。
    回复 有任何疑惑可以回复我~ 2020-10-20 11:28:43
  • bennyhuo 回复 提问者 慕前端9039556 #2
    有可能是调试用。不过我有个大胆的想法,可能是为了后面方便 Java 调用。至少现在 Swift 就已经可以直接调用 suspend 函数了,这种情况下传进来的肯定不是 ContinuationImpl。
    回复 有任何疑惑可以回复我~ 2020-10-20 11:32:46
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信