在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

反編譯后代碼分析2

jf_78858299 ? 來(lái)源:北洋洋洋 ? 作者:北洋洋洋 ? 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;
            //對(duì)應(yīng)的標(biāo)志位
            label34: {
               label33: {
                  var4 = IntrinsicsKt.getCOROUTINE_SUSPENDED();
                  switch(this.label) {
                  case 0:
                     ResultKt.throwOnFailure($result);
                     var2 = "掛起點(diǎn)1開(kāi)始";
                     var3 = false;
                     System.out.println(var2);
                     this.label = 1;
                     //根據(jù)返回值判斷是否為掛起函數(shù),如果為掛起函數(shù)直接返回
                     // 掛起函數(shù)會(huì)持有Continuation,掛起函數(shù)執(zhí)行后調(diào)用其resumeWith方法,之后就會(huì)回到invokeSuspend中
                     if (DelayKt.delay(1000L, this) ** var4) {
                        //協(xié)程退出
                        return var4;
                     }
                     break;
                  case 1:
                     //檢測(cè)上一步也就是delay是否發(fā)生異常或者失敗,接著執(zhí)行-----》掛起點(diǎn)1結(jié)束
                     ResultKt.throwOnFailure($result);
                     break;
                  case 2:
                     //檢測(cè)上一步也就是hello是否發(fā)生異常或者失敗,接著執(zhí)行-----》掛起點(diǎn)2結(jié)束
                     ResultKt.throwOnFailure($result);
                     break label33;
                  case 3:
                     //檢測(cè)上一步也就是delay是否發(fā)生異常或者失敗,接著執(zhí)行-----》掛起點(diǎn)3結(jié)束
                     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 = "掛起點(diǎn)1結(jié)束";
                  var3 = false;
                  //打印
                  System.out.println(var2);
                  var10000 = ExampleUnitTest.this;
                  //label增加,表示上一步執(zhí)行完成,指向下一個(gè)該執(zhí)行的函數(shù)體
                  this.label = 2;
                  //檢測(cè)hello是否為掛起函數(shù)
                  if (var10000.hello(this) ** var4) {
                     //協(xié)程退出
                     return var4;
                  }
               }

               //退出label33后執(zhí)行的函數(shù)
               var2 = "掛起點(diǎn)2結(jié)束";
               var3 = false;
               System.out.println(var2);
               //再次更正
               this.label = 3;
               //檢測(cè)是否為掛起函數(shù)
               if (DelayKt.delay(1000L, this) ** var4) {
                  //直接退出協(xié)程
                  return var4;
               }
            }
            //退出label34后執(zhí)行的函數(shù)
            var2 = "掛起點(diǎn)3結(jié)束";
            var3 = false;
            System.out.println(var2);
            var10000 = ExampleUnitTest.this;
            this.label = 4;
             //檢測(cè)是否為掛起函數(shù)
            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);
   }

}

「看完上面的反編譯解析會(huì)發(fā)現(xiàn)還差了兩個(gè)方法,沒(méi)錯(cuò),接下來(lái)就是自定的掛起函數(shù)的反編譯代碼,根據(jù)上面的分析請(qǐng)讀者親自分析下接下來(lái)的這兩個(gè)函數(shù)」

@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;
}

總而言之,言而總之。還是上一篇博客總結(jié)的道理,就是不斷的invokeSuspend標(biāo)記標(biāo)志位和掛起函數(shù)調(diào)用resumeWith。

文末致辭:

感謝東方月初提供的資料,和在分析協(xié)程原理時(shí)給予的支持。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4371

    瀏覽量

    64278
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1657

    瀏覽量

    49918
  • 編譯
    +關(guān)注

    關(guān)注

    0

    文章

    676

    瀏覽量

    33777
收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    一種用于反編譯代碼與源代碼的比較算法

    現(xiàn)有反編譯器產(chǎn)生的代碼與對(duì)應(yīng)的源代碼之間存在差異,找到并理解差異有助于改進(jìn)并完善反編譯器的設(shè)計(jì)。該文給出一種適用于C 語(yǔ)言反編譯
    發(fā)表于 03-21 15:08 ?10次下載

    8051系列單片機(jī)反編譯軟件(工具)

    8051系列單片機(jī)反編譯軟件(工具):最好的8051系列單片機(jī)反編譯軟件(window版)
    發(fā)表于 10-12 10:58 ?275次下載
    8051系列單片機(jī)<b class='flag-5'>反編譯</b>軟件(工具)

    反編譯代碼與源代碼的比較算法

    反編譯代碼與源代碼
    發(fā)表于 02-09 15:19 ?10次下載

    C32asm國(guó)產(chǎn)靜態(tài)反編譯工具源代碼

    C32asm國(guó)產(chǎn)靜態(tài)反編譯工具源代碼 [GLOBENOTE]LanguageChange=必須重新打開(kāi)應(yīng)用程序才能生效Done=完成OpenFileErr=打開(kāi) %s 文件遭遇錯(cuò)誤 [GENERAL]ButtonOk=確定
    發(fā)表于 02-24 14:12 ?49次下載

    FoxPro編程愛(ài)好者的反編譯工具源代碼

    FoxPro編程愛(ài)好者的反編譯工具源代碼 UNFOXALL 2.1獻(xiàn)給廣大FoxPro編程愛(ài)好者的反編譯工具          &nb
    發(fā)表于 02-26 16:13 ?94次下載

    C51智能反編譯

    C51智能反編譯
    發(fā)表于 04-07 17:36 ?63次下載

    8051系列單片機(jī)反編譯軟件.rar

    8051系列單片機(jī)反編譯軟件
    發(fā)表于 04-13 15:24 ?66次下載

    Android反編譯工具

    Android反編譯工具
    發(fā)表于 12-17 15:59 ?21次下載

    8051 MCU反編譯開(kāi)發(fā)方法記錄[

    8051 MCU反編譯開(kāi)發(fā)方法記錄1、項(xiàng)目背景2、開(kāi)發(fā)環(huán)境3、開(kāi)發(fā)步驟3.1 反編譯3.2 找出EEPROM的寫(xiě)入地址3.3 找出EEPROM讀寫(xiě)操作的代碼段3.4 找出EEPROM讀
    發(fā)表于 11-29 17:51 ?11次下載
    8051 MCU<b class='flag-5'>反編譯</b>開(kāi)發(fā)方法記錄[

    java反編譯常用的保護(hù)技術(shù)

    由于Java字節(jié)碼的抽象級(jí)別較高,因此它們較容易被反編譯。本節(jié)介紹了幾種常用的方法,用于保護(hù)Java字節(jié)碼不被反編譯。通常,這些方法不能夠絕對(duì)防止程序被反編譯,而是加大反編譯的難度而已
    發(fā)表于 07-29 16:00 ?797次閱讀

    反編譯后代碼分析1

    ?協(xié)程掛起讓異步代碼可以像同步代碼一樣調(diào)用,但其本質(zhì)還是同步,即協(xié)程體中的代碼其實(shí)是同步。 > ?因?yàn)閰f(xié)程也只是對(duì)線程池的封裝,所以需要了解些線程的一些知識(shí)。線程本身已經(jīng)有的協(xié)程也會(huì)有,但是協(xié)程有的線程不一定有 >
    的頭像 發(fā)表于 02-14 15:25 ?599次閱讀

    SpringBoot項(xiàng)目Jar包加密防止反編譯方案

    最近項(xiàng)目要求部署到其他公司的服務(wù)器上,但是又不想將源碼泄露出去。要求對(duì)正式環(huán)境的啟動(dòng)包進(jìn)行安全性處理,防止客戶直接通過(guò)反編譯工具將代碼反編譯出來(lái)。
    的頭像 發(fā)表于 12-12 14:04 ?1641次閱讀
    SpringBoot項(xiàng)目Jar包加密防止<b class='flag-5'>反編譯</b>方案

    ida反編譯出來(lái)代碼能直接用嗎

    IDA反編譯出來(lái)的代碼通常 不能直接使用 ,這主要基于以下幾個(gè)方面的原因: 一、代碼的不完整性 IDA反編譯生成的代碼可能缺少原始源
    的頭像 發(fā)表于 09-02 10:55 ?1333次閱讀

    java反編譯代碼可以修改么

    Java反編譯是一種將編譯后的Java字節(jié)碼(.class文件)轉(zhuǎn)換回源代碼的過(guò)程。反編譯后的代碼可以進(jìn)行修改,但是需要注意,
    的頭像 發(fā)表于 09-02 11:00 ?1175次閱讀

    java反編譯能拿到源碼嗎

    Java反編譯是一種將編譯后的Java字節(jié)碼(.class文件)轉(zhuǎn)換回Java源代碼的過(guò)程。雖然反編譯可以幫助理解代碼的邏輯和結(jié)構(gòu),但它并不
    的頭像 發(fā)表于 09-02 11:03 ?1683次閱讀
    主站蜘蛛池模板: 手机看片国产在线 | 在线播放一区二区精品产 | 国产在线h视频 | 色视频免费在线 | 欧美激情在线 | 国产黄色网 | 97色在线| 亚洲一区在线视频观看 | 亚洲国产精品久久久久婷婷软件 | 亚洲一区亚洲二区 | 精品免费久久久久久成人影院 | 午夜视频在线免费 | 神马国产| 亚洲一级毛片免观看 | 六九视频在线观看 | 免费 的黄色| 国产情侣草莓视频在线 | 国产无套粉嫩白浆 | 18欧美乱大交| 日本写真高清视频免费网站网 | 高h视频网站 | 在线播放免费视频 | 亚洲毛片网 | 亚洲小视频在线播放 | 天天干天天操天天爱 | 高清在线免费观看 | 视色在线视频 | 性欧美暴力猛交69hd | 天天插日日射 | 能看毛片的网址 | 中文字幕123| 久久这里只精品热在线8 | 国产老师的丝袜在线看 | a看片| 秋霞特色大片18入口私人高清 | 国产亚洲精品仙踪林在线播放 | 一区二区视频 | 免费大片av手机看片 | 玖玖精品国产 | 欧美日本一区二区三区道 | 男女视频在线观看免费 |