反编译后代码分析
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文章
4304浏览量
62416 -
编译器
+关注
关注
1文章
1618浏览量
49044 -
编译
+关注
关注
0文章
653浏览量
32803
发布评论请先 登录
相关推荐
一种用于反编译代码与源代码的比较算法
现有反编译器产生的代码与对应的源代码之间存在差异,找到并理解差异有助于改进并完善反编译器的设计。该文给出一种适用于C 语言反编译
发表于 03-21 15:08
•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 MCU反编译开发方法记录[
8051 MCU反编译开发方法记录1、项目背景2、开发环境3、开发步骤3.1 反编译3.2 找出EEPROM的写入地址3.3 找出EEPROM读写操作的代码段3.4 找出EEPROM读
发表于 11-29 17:51
•11次下载
java反编译常用的保护技术
由于Java字节码的抽象级别较高,因此它们较容易被反编译。本节介绍了几种常用的方法,用于保护Java字节码不被反编译。通常,这些方法不能够绝对防止程序被反编译,而是加大反编译的难度而已
发表于 07-29 16:00
•690次阅读
反编译后代码分析1
❝协程挂起让异步代码可以像同步代码一样调用,但其本质还是同步,即协程体中的代码其实是同步。
> ❝因为协程也只是对线程池的封装,所以需要了解些线程的一些知识。线程本身已经有的协程也会有,但是协程有的线程不一定有
>
ida反编译出来代码能直接用吗
IDA反编译出来的代码通常 不能直接使用 ,这主要基于以下几个方面的原因: 一、代码的不完整性 IDA反编译生成的代码可能缺少原始源
java反编译的代码可以修改么
Java反编译是一种将编译后的Java字节码(.class文件)转换回源代码的过程。反编译后的代码可以进行修改,但是需要注意,
java反编译能拿到源码吗
Java反编译是一种将编译后的Java字节码(.class文件)转换回Java源代码的过程。虽然反编译可以帮助理解代码的逻辑和结构,但它并不
评论