0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

反编译后代码分析2

jf_78858299 来源:北洋洋洋 作者:北洋洋洋 2023-02-14 15:27 次阅读

反编译后代码分析

public final class ExampleUnitTest {
   @Test
   public final void addition_isCorrect() {
      Assert.assertEquals(4L, 4L);

      BuildersKt.launch$default((CoroutineScope)GlobalScope.INSTANCE, (CoroutineContext)null, (CoroutineStart)null, (Function2)(new Function2((Continuation)null) {
         int label;

         @Nullable
         public final Object invokeSuspend(@NotNull Object $result) {
            ExampleUnitTest var10000;
            String var2;
            boolean var3;
            Object var4;
            //对应的标志位
            label34: {
               label33: {
                  var4 = IntrinsicsKt.getCOROUTINE_SUSPENDED();
                  switch(this.label) {
                  case 0:
                     ResultKt.throwOnFailure($result);
                     var2 = "挂起点1开始";
                     var3 = false;
                     System.out.println(var2);
                     this.label = 1;
                     //根据返回值判断是否为挂起函数,如果为挂起函数直接返回
                     // 挂起函数会持有Continuation,挂起函数执行后调用其resumeWith方法,之后就会回到invokeSuspend中
                     if (DelayKt.delay(1000L, this) ** var4) {
                        //协程退出
                        return var4;
                     }
                     break;
                  case 1:
                     //检测上一步也就是delay是否发生异常或者失败,接着执行-----》挂起点1结束
                     ResultKt.throwOnFailure($result);
                     break;
                  case 2:
                     //检测上一步也就是hello是否发生异常或者失败,接着执行-----》挂起点2结束
                     ResultKt.throwOnFailure($result);
                     break label33;
                  case 3:
                     //检测上一步也就是delay是否发生异常或者失败,接着执行-----》挂起点3结束
                     ResultKt.throwOnFailure($result);
                     break label34;
                  case 4:
                     ResultKt.throwOnFailure($result);
                     return Unit.INSTANCE;
                  default:
                     throw new IllegalStateException("call to 'resume' before 'invoke' with coroutine");
                  }

                  var2 = "挂起点1结束";
                  var3 = false;
                  //打印
                  System.out.println(var2);
                  var10000 = ExampleUnitTest.this;
                  //label增加,表示上一步执行完成,指向下一个该执行的函数体
                  this.label = 2;
                  //检测hello是否为挂起函数
                  if (var10000.hello(this) ** var4) {
                     //协程退出
                     return var4;
                  }
               }

               //退出label33后执行的函数
               var2 = "挂起点2结束";
               var3 = false;
               System.out.println(var2);
               //再次更正
               this.label = 3;
               //检测是否为挂起函数
               if (DelayKt.delay(1000L, this) ** var4) {
                  //直接退出协程
                  return var4;
               }
            }
            //退出label34后执行的函数
            var2 = "挂起点3结束";
            var3 = false;
            System.out.println(var2);
            var10000 = ExampleUnitTest.this;
            this.label = 4;
             //检测是否为挂起函数
            if (var10000.word(this) ** var4) {
               return var4;
            } else {
               return Unit.INSTANCE;
            }
         }


         @NotNull
         public final Continuation create(@Nullable Object value, @NotNull Continuation completion) {
            Intrinsics.checkNotNullParameter(completion, "completion");
            Function2 var3 = new constructor>(completion);
            return var3;
         }

         public final Object invoke(Object var1, Object var2) {
            return (()this.create(var1, (Continuation)var2)).invokeSuspend(Unit.INSTANCE);
         }
      }), 3, (Object)null);
   }

}

「看完上面的反编译解析会发现还差了两个方法,没错,接下来就是自定的挂起函数的反编译代码,根据上面的分析请读者亲自分析下接下来的这两个函数」

@Nullable
public final Object hello(@NotNull Continuation $completion) {
   Object var10000 = BuildersKt.withContext((CoroutineContext)Dispatchers.getIO(), (Function2)(new Function2((Continuation)null) {
      int label;

      @Nullable
      public final Object invokeSuspend(@NotNull Object $result) {
      Object var4 = IntrinsicsKt.getCOROUTINE_SUSPENDED();
      switch(this.label) {
         case 0:
         ResultKt.throwOnFailure($result);
         this.label = 1;
         if (DelayKt.delay(1000L, this) ** var4) {
            return var4;
         }
         break;
         case 1:
         ResultKt.throwOnFailure($result);
         break;
         default:
         throw new IllegalStateException("call to 'resume' before 'invoke' with coroutine");
      }

      String var2 = "hello";
      boolean var3 = false;
      System.out.println(var2);
      return Unit.INSTANCE;
   }

      @NotNull
      public final Continuation create(@Nullable Object value, @NotNull Continuation completion) {
      Intrinsics.checkNotNullParameter(completion, "completion");
      Function2 var3 = new constructor>(completion);
      return var3;
   }

      public final Object invoke(Object var1, Object var2) {
      return (()this.create(var1, (Continuation)var2)).invokeSuspend(Unit.INSTANCE);
   }
   }), $completion);
   return var10000 ** IntrinsicsKt.getCOROUTINE_SUSPENDED() ? var10000 : Unit.INSTANCE;
}

@Nullable
public final Object word(@NotNull Continuation $completion) {
   Object var10000 = BuildersKt.withContext((CoroutineContext)Dispatchers.getIO(), (Function2)(new Function2((Continuation)null) {
      int label;

      @Nullable
      public final Object invokeSuspend(@NotNull Object $result) {
      Object var4 = IntrinsicsKt.getCOROUTINE_SUSPENDED();
      switch(this.label) {
         case 0:
         ResultKt.throwOnFailure($result);
         this.label = 1;
         if (DelayKt.delay(1000L, this) ** var4) {
            return var4;
         }
         break;
         case 1:
         ResultKt.throwOnFailure($result);
         break;
         default:
         throw new IllegalStateException("call to 'resume' before 'invoke' with coroutine");
      }

      String var2 = "word";
      boolean var3 = false;
      System.out.println(var2);
      return Unit.INSTANCE;
   }

      @NotNull
      public final Continuation create(@Nullable Object value, @NotNull Continuation completion) {
      Intrinsics.checkNotNullParameter(completion, "completion");
      Function2 var3 = new constructor>(completion);
      return var3;
   }

      public final Object invoke(Object var1, Object var2) {
      return (()this.create(var1, (Continuation)var2)).invokeSuspend(Unit.INSTANCE);
   }
   }), $completion);
   return var10000 ** IntrinsicsKt.getCOROUTINE_SUSPENDED() ? var10000 : Unit.INSTANCE;
}

总而言之,言而总之。还是上一篇博客总结的道理,就是不断的invokeSuspend标记标志位和挂起函数调用resumeWith。

文末致辞:

感谢东方月初提供的资料,和在分析协程原理时给予的支持。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 函数
    +关注

    关注

    3

    文章

    4276

    浏览量

    62303
  • 编译器
    +关注

    关注

    1

    文章

    1615

    浏览量

    49007
  • 编译
    +关注

    关注

    0

    文章

    648

    浏览量

    32764
收藏 人收藏

    评论

    相关推荐

    一种用于反编译代码与源代码的比较算法

    现有反编译器产生的代码与对应的源代码之间存在差异,找到并理解差异有助于改进并完善反编译器的设计。该文给出一种适用于C 语言反编译
    发表于 03-21 15:08 10次下载

    8051系列单片机反编译软件(工具)

    8051系列单片机反编译软件(工具):最好的8051系列单片机反编译软件(window版)
    发表于 10-12 10:58 273次下载
    8051系列单片机<b class='flag-5'>反编译</b>软件(工具)

    8051系列单片机反编译软件(dos版)

    8051系列单片机反编译软件(dos版):
    发表于 10-12 11:01 0次下载
    8051系列单片机<b class='flag-5'>反编译</b>软件(dos版)

    反编译代码与源代码的比较算法

    反编译代码与源代码
    发表于 02-09 15:19 10次下载

    C32asm国产静态反编译工具源代码

    C32asm国产静态反编译工具源代码 [GLOBENOTE]LanguageChange=必须重新打开应用程序才能生效Done=完成OpenFileErr=打开 %s 文件遭遇错误 [GENERAL]ButtonOk=确定
    发表于 02-24 14:12 49次下载

    FoxPro编程爱好者的反编译工具源代码

    FoxPro编程爱好者的反编译工具源代码 UNFOXALL 2.1献给广大FoxPro编程爱好者的反编译工具          &nb
    发表于 02-26 16:13 94次下载

    8051系列单片机反编译软件.rar

    8051系列单片机反编译软件
    发表于 04-13 15:24 66次下载

    Android反编译工具

    Android反编译工具
    发表于 12-17 15:59 21次下载

    8051 MCU反编译开发方法记录[

    8051 MCU反编译开发方法记录1、项目背景2、开发环境3、开发步骤3.1 反编译3.2 找出EEPROM的写入地址3.3 找出EEPROM读写操作的代码段3.4 找出EEPROM读
    发表于 11-29 17:51 11次下载
    8051 MCU<b class='flag-5'>反编译</b>开发方法记录[

    java反编译常用的保护技术

    由于Java字节码的抽象级别较高,因此它们较容易被反编译。本节介绍了几种常用的方法,用于保护Java字节码不被反编译。通常,这些方法不能够绝对防止程序被反编译,而是加大反编译的难度而已
    发表于 07-29 16:00 685次阅读

    反编译后代码分析1

    ❝协程挂起让异步代码可以像同步代码一样调用,但其本质还是同步,即协程体中的代码其实是同步。 > ❝因为协程也只是对线程池的封装,所以需要了解些线程的一些知识。线程本身已经有的协程也会有,但是协程有的线程不一定有 >
    的头像 发表于 02-14 15:25 426次阅读

    SpringBoot项目Jar包加密防止反编译方案

    最近项目要求部署到其他公司的服务器上,但是又不想将源码泄露出去。要求对正式环境的启动包进行安全性处理,防止客户直接通过反编译工具将代码反编译出来。
    的头像 发表于 12-12 14:04 1205次阅读
    SpringBoot项目Jar包加密防止<b class='flag-5'>反编译</b>方案

    ida反编译出来代码能直接用吗

    IDA反编译出来的代码通常 不能直接使用 ,这主要基于以下几个方面的原因: 一、代码的不完整性 IDA反编译生成的代码可能缺少原始源
    的头像 发表于 09-02 10:55 419次阅读

    java反编译代码可以修改么

    Java反编译是一种将编译后的Java字节码(.class文件)转换回源代码的过程。反编译后的代码可以进行修改,但是需要注意,
    的头像 发表于 09-02 11:00 415次阅读

    java反编译能拿到源码吗

    Java反编译是一种将编译后的Java字节码(.class文件)转换回Java源代码的过程。虽然反编译可以帮助理解代码的逻辑和结构,但它并不
    的头像 发表于 09-02 11:03 563次阅读