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

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

3天内不再提示

反编译后代码分析1

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

@

  • 反编译后代码分析

关于协程的一些理解

❝协程挂起让异步代码可以像同步代码一样调用,但其本质还是同步,即协程体中的代码其实是同步。

❝因为协程也只是对线程池的封装,所以需要了解些线程的一些知识。线程本身已经有的协程也会有,但是协程有的线程不一定有

❝编译器会为每一个挂起函数生成一个匿名内部类,其继承SuspendLabmba类重写其invokeSuspend方法,这个方法里面即为协程体的代码【大致内容请先了解】

❝编译器会对协程体中的挂起函数和普通函数进行切割,切割时进行label的自增来保证之后代码的执行顺序,即协程保证运行顺序的本质。【对比线程:进行PC程序计数器的控制来恢复执行】

❝协程体中会添加一个label字段,标识接下来该运行协程体中的哪行代码【即协程如何知道自己执行到哪步是用这个label完成的】(对比线程:线程存储下一个代码指令是用PC计数器来做的)

❝协程体中的数据,看过之前那篇文章的人应该大致了解挂起函数其实就是匿名内部类,数据是保存在栈帧中的,(对比线程:也是通过栈帧中的局部变量表和操作数栈来存储数据)

❝协程体中碰到挂起函数会直接返回,等待挂起函数通知

❝当我们调用挂起函数时都会传入一个Continuation,挂起函数执行完正常退出或者抛异常退出这个时候外面的协程需要知道这个信息,怎么通知呢?通过Continuation的resumewith方法,这个方法会再次调用invokeSuspend取出label来保证之后执行代码的顺序,即协程自动恢复运行的本质

❝(对比线程:方法正常执行完成之后有两种情况1、正常结束,2.异常退出。其里面的PC计数器保证之后执行的代码顺序,也就是说协程在原本线程之上又加了一层控制)

❝协程体中可以在开启一个协程,也就是协程具有父子关系的本质。在协程伊始的时候会默认给一些默认数据(包括协程体运行在哪个线程即调度器其通过拦截器实现,执行状态检测用到的Job,拦截器等等)这些数据保存在协程的上下文中,

❝当在协程体中又开启了一个协程时,其会获取父协程的上下文进行和自己的合并作为自己的上下文。

【简而言之,和协程本身有关的数据保存在上下文中,和业务有关的代码会放在匿名内部类中。】

基础框架层源码分析

val createCoroutine = suspend {
                //挂起函数代码

            }.createCoroutine(object : Continuation<Unit> {
                override val context: CoroutineContext
                    get() = TODO("Not yet implemented")

                override fun resumeWith(result: Result<Unit>) {
     //可从result中获取返回值或异常
                }
            })

   createCoroutine.resume(Unit)

❝1.编译器会对挂起函数做处理,让他继承SuspendCorunting,重写其invokeSuspend方法,方法体为挂起函数中的代码 2.当手动调用createCoroutine返回值的resume方法的时候,会调用到resumeWith函数,其里面会调用invokeSuspend也就是挂起函数体里面的代码,之后两种情况:3.碰到普通函数直接执行;碰到挂起函数传入Continuation并直接返回一个标识代表其为挂起函数,这个时候协程直接退出,之后挂起函数执行完调用Continuation的resumeWith继续执行方法体代码【通过label确定顺序】 4.在invokeSuepend中可以通过result获取挂起函数执行的结果:异常或者返回值。进行对应处理。

实战分析

class ExampleUnitTest {
    @Test
    fun addition_isCorrect() {
        GlobalScope.launch {
            println("挂起点1开始")
            delay(1000)         //挂起点1
            println("挂起点1结束")
            hello()             //挂起点2
            println("挂起点2结束")
            delay(1000)         //挂起点3
            println("挂起点3结束")
            word()              //挂起点4
        }
    }
    //挂起函数,编译器默认传入Continuation
    suspend fun hello(){
        //再次挂起
        withContext(Dispatchers.IO){
            delay(1000)
            println("hello")
        }
    }
    
    suspend fun word(){
        withContext(Dispatchers.IO){
            delay(1000)
            println("word")
        }
    }
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 封装
    +关注

    关注

    128

    文章

    8207

    浏览量

    144058
  • 代码
    +关注

    关注

    30

    文章

    4863

    浏览量

    69748
  • 线程
    +关注

    关注

    0

    文章

    507

    浏览量

    19920
收藏 人收藏

    相关推荐

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

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

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

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

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

    反编译代码与源代码
    发表于 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次下载

    C51智能反编译

    C51智能反编译
    发表于 04-07 17:36 63次下载

    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 755次阅读

    反编译后代码分析2

    编译器会为每一个挂起函数生成一个匿名内部类,其继承SuspendLabmba类重写其invokeSuspend方法,这个方法里面即为协程体的代码【大致内容请先了解】
    的头像 发表于 02-14 15:27 549次阅读

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

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

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

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

    java反编译代码可以修改么

    的影响。 1. Java反编译工具 在Java反编译领域,有一些知名的工具可以帮助开发者将字节码转换回源代码。这些工具包括: JD-GUI :一个图形界面的
    的头像 发表于 09-02 11:00 998次阅读

    java反编译能拿到源码吗

    在语法和风格上有所不同的代码,因为它们主要关注于恢复代码的逻辑结构,而不是精确复制原始代码的每个细节。 1. 反编译的基本原理 Java程序
    的头像 发表于 09-02 11:03 1459次阅读