反編譯后代碼分析
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í)給予的支持。
-
函數(shù)
+關(guān)注
關(guān)注
3文章
4371瀏覽量
64278 -
編譯器
+關(guān)注
關(guān)注
1文章
1657瀏覽量
49918 -
編譯
+關(guān)注
關(guān)注
0文章
676瀏覽量
33777
發(fā)布評(píng)論請(qǐng)先 登錄
一種用于反編譯代碼與源代碼的比較算法
8051系列單片機(jī)反編譯軟件(工具)

C32asm國(guó)產(chǎn)靜態(tài)反編譯工具源代碼
FoxPro編程愛(ài)好者的反編譯工具源代碼
8051 MCU反編譯開(kāi)發(fā)方法記錄[

java反編譯常用的保護(hù)技術(shù)
反編譯后代碼分析1
SpringBoot項(xiàng)目Jar包加密防止反編譯方案

評(píng)論