一步步手动实现热修复(二)-类的加载机制简要介绍

*本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布

本节课程主要分为3块:

  • 1.一步步手动实现热修复(一)-dex文件的生成与加载
  • 2.一步步手动实现热修复(二)-类的加载机制简要介绍
  • 3.一步步手动实现热修复(三)-Class文件的替换

本节示例所用到的任何资源都已开源,项目中包含工程中所用到代码、示例图片、说明文档。项目地址为:
https://code.csdn.net/u011064099/sahadevhotfix/tree/master


本节内容是为了给下节内容做知识铺垫,所以如果要需要了解热修复技术,本节内容的知识点必不可少。

一个类在被加载到内存之前要经过加载、验证、准备等过程。经过这些过程之后,虚拟机才会从方法区将代表类的运行时数据结构转换为内存中的Class。

我们这节内容的重点在于一个类是如何被加载的,所以我们从类的加载入口开始。

类的加载是由虚拟机触发的,类的加载入口位于ClassLoader的loadClassInternal()方法:

    // This method is invoked by the virtual machine to load a class.private Class<?> loadClassInternal(String name)throws ClassNotFoundException{// For backward compatibility, explicitly lock on 'this' when// the current class loader is not parallel capable.if (parallelLockMap == null) {synchronized (this) {return loadClass(name);}} else {return loadClass(name);}}

这段方法还有段注释说明:这个方法由虚拟机调用用来加载一个类。我们看到这个类的内部最后调用了loadClass()方法。那我们进入loadClass()方法看看:

    public Class<?> loadClass(String name) throws ClassNotFoundException {return loadClass(name, false);}

loadClass()方法方法内部调用了loadClass()的重载方法:

    protected Class<?> loadClass(String name, boolean resolve)throws ClassNotFoundException{synchronized (getClassLoadingLock(name)) {// First, check if the class has already been loadedClass<?> c = findLoadedClass(name);if (c == null) {long t0 = System.nanoTime();try {if (parent != null) {c = parent.loadClass(name, false);} else {c = findBootstrapClassOrNull(name);}} catch (ClassNotFoundException e) {// ClassNotFoundException thrown if class not found// from the non-null parent class loader}if (c == null) {// If still not found, then invoke findClass in order// to find the class.long t1 = System.nanoTime();c = findClass(name);// this is the defining class loader; record the statssun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);sun.misc.PerfCounter.getFindClasses().increment();}}if (resolve) {resolveClass(c);}return c;}}

loadClass()方法大概做了以下工作:

  • 首先查找该类是否已经被加载.
  • 如果该ClassLoader有父加载器,那么调用父加载器的loadClass()方法.
  • 如果没有父加载器,则调用findBootstrapClassOrNull()方法进行加载,该方法会使用引导类加载器进行加载。普通类是不会被该加载器加载到的,所以这里一般返回null.
  • 如果前面的步骤都没找到,那调用自身的findClass()方法进行查找。

好,ClassLoader的findClass()方法是个空方法,所以这个过程一般是由子加载器实现的。Java的加载器这么设计是有一定的渊源的,感兴趣的读者可以自行查找书籍了解。

    protected Class<?> findClass(String name) throws ClassNotFoundException {throw new ClassNotFoundException(name);}

在Android中,ClassLoader的直接子类是BaseDexClassLoader,我们看一下BaseDexClassLoader的findClass()实现:

    @Overrideprotected Class<?> findClass(String name) throws ClassNotFoundException {Class clazz = pathList.findClass(name);if (clazz == null) {throw new ClassNotFoundException(name);}return clazz;}

Tips: 有需要虚拟机以及类加载器全套代码的,请使用以下命令克隆:
git clone https://android.googlesource.com/platform/dalvik-snapshot
相关代码位于项目的ics-mr1分支上。

看到这里我们可以知道,Android中类的查找是通过这个pathList进行查找的,而pathList又是个什么鬼呢?

在BaseDexClassLoader中声明了以下变量:

    /** structured lists of path elements */private final DexPathList pathList;

所以我们可以看看DexPathList的findClass()方法做了什么:

    public Class findClass(String name) {for (Element element : dexElements) {DexFile dex = element.dexFile;if (dex != null) {Class clazz = dex.loadClassBinaryName(name, definingContext);if (clazz != null) {return clazz;}}}return null;}

这里通过遍历dexElements中的Element对象进行查找,最终走的是DexFile的loadClassBinaryName()方法:

    public Class loadClassBinaryName(String name, ClassLoader loader) {return defineClass(name, loader, mCookie);}private native static Class defineClass(String name, ClassLoader loader, int cookie);

到此为止,我们就将类的加载过程梳理完了。

下一节课我们将会介绍如何实现类的替换。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/478745.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

知识图谱能否拯救NLP的未来?

文 | Luke知乎知识图谱是NLP的未来吗&#xff1f;2021年了&#xff0c;不少当年如日中天技术到今天早已无人问津&#xff0c;而知识图谱这个AI界的大IP最火的时候应该是18&#xff0c;19年&#xff0c;彼时上到头部大厂下到明星创业公司都在PR自己图谱NLP布局能够赋予AI认知能力…

论文浅尝 | Data Intelligence 已出版的知识图谱主题论文

本文转载自公众号&#xff1a;DI数据智能。 知识图谱被称为人工智能的基石&#xff0c;它的前身是语义网&#xff0c;由谷歌在2012年率先提出&#xff0c;用于改善自身的搜索业务。Data Intelligence执行…

一步步手动实现热修复(三)-Class文件的替换

*本篇文章已授权微信公众号 guolin_blog &#xff08;郭霖&#xff09;独家发布 本节课程主要分为3块&#xff1a; 1.一步步手动实现热修复(一)-dex文件的生成与加载2.一步步手动实现热修复(二)-类的加载机制简要介绍3.一步步手动实现热修复(三)-Class文件的替换 本节示例所…

Vision Transformer 论文解读

原文链接&#xff1a;https://blog.csdn.net/qq_16236875/article/details/108964948 扩展阅读&#xff1a;吸取CNN优点&#xff01;LeViT&#xff1a;用于快速推理的视觉Transformer https://zhuanlan.zhihu.com/p/363647380 Abstract: Transformer 架构早已在自然语言处理…

长这么大,才知道数据集不用下载可以直接在线使用

每天清晨打开电脑&#xff0c;搜索所需的数据集&#xff0c;点击“Download”&#xff0c;愉快地眯上眼睛&#xff0c;期待n个小时后醒来乖巧下载好的数据&#xff0c;开始放进模型像小仓鼠进滚轮一样快乐奔跑。梦醒时分&#xff0c;一个“Error”蹦进眼睛里&#xff0c;美好码…

会议交流 - CCKS2020 | 2020年全国知识图谱与语义计算大会

OpenKG开放知识图谱&#xff08;简称 OpenKG&#xff09;旨在促进中文知识图谱数据的开放与互联&#xff0c;促进知识图谱和语义技术的普及和广泛应用。

LeetCode 739. 每日温度(单调栈)

1. 题目 根据每日 气温 列表&#xff0c;请重新生成一个列表&#xff0c;对应位置的输入是你需要再等待多久温度才会升高超过该日的天数。如果之后都不会升高&#xff0c;请在该位置用 0 来代替。 例如&#xff0c;给定一个列表 temperatures [73, 74, 75, 71, 69, 72, 76, …

令人振奋的好消息!2016年12月8日Google Developers中文网站发布!

令人振奋的好消息&#xff01; 2016年12月8日Google Developers中文网站发布&#xff01; 以往我们需要访问Android的开发网站、Google的开发网站都需要翻墙&#xff0c;苦不堪言。现在Google发布了中文网站&#xff0c;怎能不让人开心&#xff1f;&#xff01; Android中文…

美团外卖Android Lint代码检查实践

概述 Lint是Google提供的Android静态代码检查工具&#xff0c;可以扫描并发现代码中潜在的问题&#xff0c;提醒开发人员及早修正&#xff0c;提高代码质量。除了Android原生提供的几百个Lint规则&#xff0c;还可以开发自定义Lint规则以满足实际需要。 为什么要使用Lint 在美团…

零基础入门NLP - 新闻文本分类,正式赛第一名方案分享

零基础入门NLP - 新闻文本分类&#xff0c;正式赛第一名方案分享&#xff1a;https://mp.weixin.qq.com/s/7WpZUqdlItBToLYuRLm44g

这篇论文提出了一个文本-知识图谱的格式转换器...

文 | 花小花PosyHello, 大家好&#xff0c;我是小花。今天给大家介绍一篇有野心的paper。为何如此说呢&#xff1f;因为该工作提出了一个知识的格式转换器&#xff0c;用于转换 无结构化的纯文本(Text)和结构化的知识图谱(KG) 。换句话说&#xff0c;给模型一打句子&#xff0c…

论文小综 | Using External Knowledge on VQA

本文转载自公众号&#xff1a;浙大KG。本文作者&#xff1a;陈卓&#xff0c;浙江大学在读博士&#xff0c;主要研究方向为图神经网络和知识图谱表示学习我们生活在一个多模态的世界中。视觉的捕捉与理解&#xff0c;知识的学习与感知&#xff0c;语言的交流与表达&#xff0c;…

如何修改TextView链接点击实现(包含链接生成与点击原理分析)

*这篇文章的主要目的是想要大家学习如何了解实现&#xff0c;修改实现&#xff0c;以达到举一反三&#xff0c;自行解决问题的目的。 某天遇到这么一个需求&#xff1a;在TextView中的文本链接要支持跳转&#xff0c;嗯&#xff0c;这个好办&#xff0c;TextView本身是支持的&…

LeetCode 752. 打开转盘锁(图的BFS最短路径)

1. 题目 你有一个带有四个圆形拨轮的转盘锁。每个拨轮都有10个数字&#xff1a; ‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’ 。每个拨轮可以自由旋转&#xff1a;例如把 ‘9’ 变为 ‘0’&#xff0c;‘0’ 变为 ‘9’ 。每次旋转都只能旋转一个拨…

使用TensorFlow训练WDL模型性能问题定位与调优

简介 TensorFlow是Google研发的第二代人工智能学习系统&#xff0c;能够处理多种深度学习算法模型&#xff0c;以功能强大和高可扩展性而著称。TensorFlow完全开源&#xff0c;所以很多公司都在使用&#xff0c;但是美团点评在使用分布式TensorFlow训练WDL模型时&#xff0c;发…

docker镜像打包save,载入load,启动run

docker镜像打包save&#xff0c;载入load&#xff0c;启动run docker打包&#xff0c;针对的是镜像&#xff0c;而不是运行中的容器。 查看当前系统的镜像文件&#xff1a; docker images 首先&#xff0c;将当前运行中的&#xff0c;已经自定义修改之后的容器保存为新的镜像…

会议交流 - CNCC 技术论坛 | NLP中知识和数据怎么选?当然是全都要!——第四届中文信息技术发展战略研讨会...

本文转载自公众号&#xff1a;中国计算机学会 。本论坛将于CNCC2020期间&#xff0c;10月23日下午16:00-18:00&#xff0c;在北京新世纪日航饭店3层南京厅举行。本论坛将邀请多位来自国内著名高校和人工智能企业的知名自然语言处理专家介绍他们在知识图谱、知识获取、预训练模型…

从我开发过的Tensorflow、飞桨、无量框架看深度学习这几年

文 | Peter潘欣知乎和深度学习框架打交道已有多年时间。从Google的TensorFlow, 到百度的PaddlePaddle&#xff0c;再到现在腾讯的无量。很庆幸在AI技术爆发的这些年横跨中美几家公司&#xff0c;站在一个比较好的视角看着世界发生巨大的变化。在这些经历中&#xff0c;视角在不…

探索Glide对Gif图片资源的获取、解析过程

先预祝大家汤圆节快乐&#xff01;很久没写博客了。今天我们来探索一下Glide是如何支持Gif图片加载的。 本篇博客的目的 了解代码分析的基本思路与方法了解Glide是如何对Gif图片进行支持的 探索背景 为什么会有这么一个想法呢&#xff0c;一来一直对Glide是知其名而不知其所…

美团“猜你喜欢”深度学习排序模型实践

引言 推荐作为解决信息过载和挖掘用户潜在需求的技术手段&#xff0c;在美团点评这样业务丰富的生活服务电子商务平台&#xff0c;发挥着重要的作用。在美团App里&#xff0c;首页的“猜你喜欢”、运营区、酒店旅游推荐等重要的业务场景&#xff0c;都是推荐的用武之地。 目前&…