ClassLoader

Java /Android 默认ClassLoader是PathClassLoader

Android 的 PathClassLoader 和DexClassLoader 都是BaseDexClassLoader的子类

BaseClassLoader是ClassLoader的子类,通过loadClass方法加载,Android将Java的ClassLoader简化了,第二个参数arg2 无效

loadClass 通过 findLoadedClass 方法进行查找,先查找缓存,缓存有就返回,否则就

查找父Loader,如果父加载器没有,就执行 findBootstrapClassOrNull()//空方法

如果都找不到就执行findClass找,自己加载

缓存时独立共享的内存

从上往下加载

BaseDexClassLoader

findClass:

pathList = DexPathList

  @Override
203      protected Class<?> findClass(String name) throws ClassNotFoundException {
204          // First, check whether the class is present in our shared libraries.
205          if (sharedLibraryLoaders != null) {
206              for (ClassLoader loader : sharedLibraryLoaders) {
207                  try {
208                      return loader.loadClass(name);
209                  } catch (ClassNotFoundException ignored) {
210                  }
211              }
212          }
213          // Check whether the class in question is present in the dexPath that
214          // this classloader operates on.
215          List<Throwable> suppressedExceptions = new ArrayList<Throwable>();
216          Class c = pathList.findClass(name, suppressedExceptions);
217          if (c == null) {
218              ClassNotFoundException cnfe = new ClassNotFoundException(
219                      "Didn't find class \"" + name + "\" on path: " + pathList);
220              for (Throwable t : suppressedExceptions) {
221                  cnfe.addSuppressed(t);
222              }
223              throw cnfe;
224          }
225          return c;
226      }

主要通过pathList.findClass(name,suppressedExecption) 查找

pathList.findClass

   public Class<?> findClass(String name, List<Throwable> suppressed) {
531          for (Element element : dexElements) {
532              Class<?> clazz = element.findClass(name, definingContext, suppressed);
533              if (clazz != null) {
534                  return clazz;
535              }
536          }
537  
538          if (dexElementsSuppressedExceptions != null) {
539              suppressed.addAll(Arrays.asList(dexElementsSuppressedExceptions));
540          }
541          return null;
542      }

通过Element.-dexFile.-loadClass-,defindClass-native

split()  -------- Unix系统分割使用 : ,Window使用 ;

new DexClassLoader时可以("path1:path2:path3:path4:path5:path6")

Element[] nakeDexElements(){

for(File file : files){

//添加

}

}

     private static Element[] makeDexElements(List<File> files, File optimizedDirectory,
369              List<IOException> suppressedExceptions, ClassLoader loader, boolean isTrusted) {
370        Element[] elements = new Element[files.size()];
371        int elementsPos = 0;
372        /*
373         * Open all files and load the (direct or contained) dex files up front.
374         */
375        for (File file : files) {
376            if (file.isDirectory()) {
377                // We support directories for looking up resources. Looking up resources in
378                // directories is useful for running libcore tests.
379                elements[elementsPos++] = new Element(file);
380            } else if (file.isFile()) {
381                String name = file.getName();
382  
383                DexFile dex = null;
384                if (name.endsWith(DEX_SUFFIX)) { //如果是.dex
385                    // Raw dex file (not inside a zip/jar).
386                    try {
387                        dex = loadDexFile(file, optimizedDirectory, loader, elements);
388                        if (dex != null) {
389                            elements[elementsPos++] = new Element(dex, null);
390                        }
391                    } catch (IOException suppressed) {
392                        System.logE("Unable to load dex file: " + file, suppressed);
393                        suppressedExceptions.add(suppressed);
394                    }
395                } else {
396                    try {
397                        dex = loadDexFile(file, optimizedDirectory, loader, elements);
398                    } catch (IOException suppressed) {
399                        /*
400                         * IOException might get thrown "legitimately" by the DexFile constructor if
401                         * the zip file turns out to be resource-only (that is, no classes.dex file
402                         * in it).
403                         * Let dex == null and hang on to the exception to add to the tea-leaves for
404                         * when findClass returns null.
405                         */
406                        suppressedExceptions.add(suppressed);
407                    }
408  
409                    if (dex == null) {
410                        elements[elementsPos++] = new Element(file);
411                    } else {
412                        elements[elementsPos++] = new Element(dex, file);
413                    }
414                }
415                if (dex != null && isTrusted) {
416                  dex.setTrusted();
417                }
418            } else {
419                System.logW("ClassLoader referenced unknown path: " + file);
420            }
421        }
422        if (elementsPos != elements.length) {
423            elements = Arrays.copyOf(elements, elementsPos);
424        }
425        return elements;
426      }
427  

OKHttp 下载文件

自动打包补丁:

还可以通过修改字节码实现热更新

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

050-第三代软件开发-软件部署脚本(二)

第三代软件开发-软件部署脚本(二) 文章目录 第三代软件开发-软件部署脚本(二)项目介绍软件部署脚本(二) 关键字&#xff1a; Qt、 Qml、 bash、 shell、 脚本 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这个项目结合了 QML&#xff08;Qt Meta-Object Languag…

C语言从入门到精通之【基本运算符】

赋值运算符 在C语言中&#xff0c;并不意味着“相等”&#xff0c;而是一个赋值运算符。下面的赋值表达式语句&#xff1a; bmw 2002; 把值2002赋给变量bmw。也就是说&#xff0c;号左侧是一个变量名&#xff0c;右侧是赋给该变量的值。符号被称为赋值运算符。另外&#xff0…

用友GRP-U8 ReturnForWcp RCE漏洞复现

0x01 产品简介 用友GRP-U8内控管理软件是用友公司专注于国家电子政务事业,基于云计算技术所推出的新一代产品,是我国行政事业财务领域最专业的政府财务管理软件。 0x02 漏洞概述 用友GRP-U8内控管理软件/servlet/PayReturnForWcp接口处存在xxe漏洞&#xff0c;攻击者可利用xxe…

Redis配置、Redis类型

系列文章目录 第一章 Java线程池技术应用 第二章 CountDownLatch和Semaphone的应用 第三章 Spring Cloud 简介 第四章 Spring Cloud Netflix 之 Eureka 第五章 Spring Cloud Netflix 之 Ribbon 第六章 Spring Cloud 之 OpenFeign 第七章 Spring Cloud 之 GateWay 第八章 Sprin…

sklearn笔记:neighbors.NearestNeighbors

1 最近邻 class sklearn.neighbors.NearestNeighbors(*, n_neighbors5, radius1.0, algorithmauto, leaf_size30, metricminkowski, p2, metric_paramsNone, n_jobsNone)邻居搜索算法的选择通过关键字 algorithm 控制&#xff0c;它必须是 [auto, ball_tree, kd_tree, brute] …

图像格式导致halcon读取失败

图像格式&#xff1a; JPEG (jpg)&#xff0c;文件头&#xff1a;FF D8 FF PNG (png)&#xff0c;文件头&#xff1a;89 50 4E 47 GIF (gif)&#xff0c;文件头&#xff1a;47 49 46 38 Windows Bitmap (bmp)&#xff0c;文件头&#xff1a;42 4D 打开软件“notepad”使用16进…

《洛谷深入浅出基础篇》P1551亲戚——集合——并查集P1551亲戚

上链接&#xff1a;P1551 亲戚 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P1551 上题干&#xff1a; 题目背景 若某个家族人员过于庞大&#xff0c;要判断两个是否是亲戚&#xff0c;确实还很不容易&#xff0c;现在给出某个亲戚关系图…

用Postman发送xml数据

启动Postman&#xff1a; 点击左上角的“New”&#xff0c;在弹出窗中选择HTTP&#xff1a; 选择POST方法&#xff1a; 点击Body&#xff1a; 选择raw&#xff1a; 在右侧的下拉列表中选择XML&#xff1a; 在下面的输入框中输入或者从其它地方拷贝XML文本&#xff1a;…

软件测试之接口测试面试题

1、接口的定义 系统与系统之间、组件与组件之间、数据传递交换的通道 2、接口的类型 按协议&#xff1a;http、tcp、ip 按语言&#xff1a;C、java、php 按范围&#xff1a;系统与系统、内部系统与内部系统、外部系统与外部系统之间 程序划分&#xff1a;多个内部程序、内…

QML20、布局

1.概述 首先,QML同样允许大家使用硬编码的方式将位置数值直接写到代码中,但是这样做首先难以适应UI的调整,其次代码维护起来也很困难。因此不推荐这样做。推荐大家使用的是以下三种布局管理器:Row,、Column、Grid、Flow,以及使用Anchor进行布局。 2.Row QML 中的 Row 元素…

js-webApi笔记1

目录 前言 Web API的概念 什么是DOM DOM树 1、查找元素 2、其他查找元素方法 3、操作元素 4、操作元素属性 5、 操作元素样式 style 6、操作自定义属性 7、 操作表单元素属性 8、事件 9、事件绑定 10、常用鼠标事件 11、定时器 12、定时器案例 前言 Web API的概念…

最长上升子序列模型 笔记

首先附上模板&#xff1a; #include<bits/stdc.h> #define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); #define endl \nusing namespace std;typedef pair<int, int> PII; typedef long long ll;const int N 100010;int n; int a[N], q[N];int main()…

Linux脚本shell中将Windos格式字符转换为unix

众所周知&#xff0c;windos的文档直接复制到linux服务器上去&#xff0c;是需要进行格式转换的&#xff0c;否则可能出现以下报错&#xff1a; 解决方法&#xff1a; vim 脚本 输入 :set ff ##会显示字符格式 :set ffunix ##转换为unix格式 :wq ##保存退出

Word添加附件(附件图标被挡住的问题)

本文主要是为了记录一下自己使用word添加附件的时候遇到的一个坑&#xff0c;就是添加了附件&#xff0c;附件图标没有展示的问题。 选择 插入——对象&#xff0c;然后点击由文件创建然后再点击浏览本地电脑中的文件&#xff0c;选择需要添加的文件&#xff0c;当然也可以选择…

2019年五一杯数学建模B题木板最优切割方案解题全过程文档及程序

2019年五一杯数学建模 B题 木板最优切割方案 原题再现 徐州某家具厂新进一批木板如表 1 所示&#xff0c;在家具加工的过程中&#xff0c;需要使用切割工具生产表 2所示的产品。假设&#xff1a;木板厚度和割缝宽度忽略不计。   请为该家具厂给出如下问题的木板最优切割方…

解决k8s通过traefik暴露域名失败并报错:Connection Refused的问题

我敢说本篇文章是网上为数不多的解决traefik暴露域名失败问题的正确文章。 我看了网上太多讲述traefik夸夸其谈的文章了&#xff0c;包含一大堆复制粘贴的水文和还有什么所谓“阿里技术专家”的文章&#xff0c;讲的全都是错的&#xff01;基本没有一个能说到点子上去&#xf…

如何在3DMax中使用超过16个材质ID通道?

3DMAX效果通道扩展插件EffectsChannelEx教程 3DMax的材质ID通道允许我们生成渲染元素&#xff0c;这些元素可用于在合成或其他软件中产生处理或特殊效果。如对渲染或动画进行颜色校正。你可以在Photoshop中为你的静态3D渲染图像做这件事。或者使用After Effects、Blackmagic Fu…

【MySQL】表的增删改查(进阶)

一、数据库约束 1.1 约束类型 &#x1f693;NOT NULL - 指示某列不能存储 NULL 值。 &#x1f693;UNIQUE - 保证某列的每行必须有唯一的值。 &#x1f693;DEFAULT - 规定没有给列赋值时的默认值。 &#x1f693;PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。确保某列&…

阿里云2核2G3M带宽服务器,新老用户同价99元/年!续费不涨价!

作为双11服务器中备受用户关注的一款&#xff0c;轻量服务器2核2G3M带宽优惠价87元一年的价格令人惊喜。不仅价格实惠&#xff0c;而且配置也十分出色。2核2G的配置足够应对一般网站和轻量级应用的需求&#xff0c;同时3M的带宽也能够保障数据的快速传输。对于个人网站、小型企…

如何设计短域名系统

输入可能是 一个冗长的域名&#xff0c;过期时间和自定义的别名输出 自定义别名或者随机生成的短域名&#xff0c;在过期时间到来之前访问都可以被重定向到冗长的域名上约束条件 1.过期后就失效 2.短域名是唯一的 3.自定义短域名长度在7个字符&#xff08;不包含域名长度&am…