Android classLoader 双亲委托 反射 类加载

news2024/10/7 2:26:21

双亲委托

双亲委托机制,就是导入类的时候判断parent是否已经导入过该类。

作用

1、避免重复加载,当父加载器已经加载了该类的时候,没有必要子ClassLoader再加载一次。
2、安全性考虑,防止核心API库被随意篡改。

核心代码

private final ClassLoader parent;

在这里插入图片描述

类是如何被加载的

调用loadclass加载

如果使用补丁包中的类

将补丁包插入到dexElement中,并且插入到dexElement列表的最前面。

已经加载过的类还能被替换修复吗

已经加载的类在缓存中了,不会再被加载了。所以Tinker Qzone需要重启生效,防止没有Bug类已经加载了,没法修复了。

如何保证正确的dex文件先被加载

将正确的dex放在dexlist数据

热修复流程

1、获取当前应用的PathClassloader;
2、反射获取到DexPathList属性对象pathList;
3、反射修改pathList的dexElements
a)将补丁包patch.dex转化为Element[](patch)
b)获得pathList的dexElements属性(old)
c)patch+old合并,并反射赋值给pathList的dexElements

反射基础

类加载

Class.forName()

加载 -> 链接 -> 初始化
Class.forName(A)会执行A中的静态代码块。

classLoader.loadClass()

classLoader.loadClass(A)不会执行A中的静态代码块。

判断程序的classLoader

public class MainActivity extends Activity {
    private static final String TAG = "JJWorld.MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        try {
            ClassLoader cls4 = Activity.class.getClassLoader();
            Log.i(TAG, "" + cls4.getClass().getName());
            ClassLoader cls1 = Dog.class.getClassLoader();
            Log.i(TAG, "" + cls1.getClass().getName());
            ClassLoader cls2 = AppCompatActivity.class.getClassLoader();
            Log.i(TAG, "" + cls2.getClass().getName());
            ClassLoader cls3 = MainActivity.class.getClassLoader();
            Log.i(TAG, "" + cls3.getClass().getName());
        } catch (Exception e) {
            Log.i(TAG, "ClassLoader not found");
        }
        try {
            Class<?> aClass = Class.forName("android.support.v4.app.SupportActivity");
            Log.i(TAG, "aClass not found");
        } catch (ClassNotFoundException e) {
            Log.i(TAG, "class not found");
            e.printStackTrace();
        }
    }
}

输出

2023-06-19 20:26:21.520 3061-3061/cn.jj.myapplication I/JJWorld.MainActivity: class not foundjava.lang.BootClassLoader
2023-06-19 20:26:21.520 3061-3061/cn.jj.myapplication I/JJWorld.MainActivity: dalvik.system.PathClassLoader
2023-06-19 20:26:21.520 3061-3061/cn.jj.myapplication I/JJWorld.MainActivity: dalvik.system.PathClassLoader
2023-06-19 20:26:21.520 3061-3061/cn.jj.myapplication I/JJWorld.MainActivity: dalvik.system.PathClassLoader
2023-06-19 20:26:21.520 3061-3061/cn.jj.myapplication I/JJWorld.MainActivity: class not found

PathClassLoader

在这里插入图片描述

BaseDexClassLoader

在这里插入图片描述

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

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

相关文章

java【String类的常用方法】

String类 String类的常用方法1 字符串的构造方法2 String对象的比较3 字符串查找4 字符串与其他类型的转换4.1 字符串和数值互相转换4.2 大小写转换4.3 字符串转数组4.4 字符串格式化 5 字符串的替换6 字符串的截取操作7 字符串的拆分8 字符串去除空格trim()方法 String类的常用…

费报只是小 case!电子影像系统,工作效率up无限

在日常工作中,我发现许多朋友对电子影像系统存有一个错误认知,“电子影像系统,我了解,就是用来做费用报销的吧”。 但事实上,电子影像系统的实用价值远非这样,它可以解决企业许多业务场景中的难点。今天,让我们一起来探讨电子影像系统,希望能对大家在企业数字化改革中带来更多帮…

spring security oauth2学习 -- 快速入门

1.Oauth2认证协议 简单理解&#xff1a; OAuth2是目前最流行的授权协议&#xff0c;用来授权第三方应用&#xff0c;获取用户数据。 1.1 流程 客户端通过认证和授权&#xff0c;向资源服务器去访问资源。 其中&#xff0c;授权和认证都需要在授权服务器&#xff0c;由资源拥…

【Java】parallelStream().forEach() 的踩坑日记

文章目录 前言踩坑日记刨根问底解决方案小结 前言 最近一直在开发项目中的新需求&#xff0c;其中有一个需求是“解析文件&#xff08;.txt文件&#xff0c;一行就是一条数据&#xff09;中的数据并进行入库操作”。其实这个需求也很简单&#xff0c;无非就是将文件中每一行数…

架构师必须掌握的架构设计原则

如果一个架构或设计原则已经存在 15 年&#xff0c;例如单一职责和依赖倒置原则&#xff0c;我可以预期它还有 15 年甚至更久的生命期。原则是比具体技术更抽象&#xff0c;更接近事物本质&#xff0c;也更经得起时间考验的东西。这些原则沉淀在架构师的脑海中&#xff0c;最终…

彻底理解 linux 的内存回收

本文试图用最浅显的语言说明以下问题&#xff1a; 1、free 命令中的buffer/cache 是什么意思&#xff1f; 2、内存回收的机制是什么&#xff1f; 3、内存回收的门限是什么&#xff1f;也就是什么时候进行回收&#xff1f; 4、如何手动清除cache&#xff1f; 1、free 命令中的bu…

【高危】Apache NiFi H2驱动存在代码注入漏洞

漏洞描述 Apache NiFi 是一个开源的数据流处理和自动化工具&#xff0c;DBCPConnectionPool 和 HikariCPConnectionPool 是两个控制器服务&#xff0c;用于提供对数据库的连接池管理功能。 Apache NiFi 受影响版本&#xff0c;由于 DBCPConnectionPool 和 HikariCPConnectio…

景点景区门票购买核销宴会活动报名公众号系统开发

景点景区门票购买核销宴会活动报名公众号系统开发 功能特性 1.活动管理 可以新建一场或多场活动&#xff0c;管理每一场活动&#xff1b;与此同时&#xff0c;可以添加多张收费或免费门票&#xff0c;满足特定的需求&#xff1b;填写举办城市后&#xff0c;客户可通过定位服务&…

Vue + Axios全局接口防抖、节流封装实现,让你前端开发更高效

你是否有过这样的经历&#xff0c;每当你在前端开发中使用 Ajax 进行数据请求时&#xff0c;往往因为一些错误操作导致页面不断地发送请求&#xff0c;甚至导致了系统崩溃&#xff1f;为了解决这个问题&#xff0c;我们需要对接口进行防抖和节流处理。 本文将介绍如何使用 Vue …

Windows BAT脚本指令总结和笔记

最近在工作的项目工程中遇到了各式各样的bat脚本&#xff0c;故总结和记录下所遇到的指令&#xff1b; 文章目录 1 echo off2 REF3 SET4 %~dp05 %~nx06 CALL7 pushd8 rmdir 1 echo off echo off的意思是在批处理运行命令的时候不会一条一条的显示执行的命令&#xff0c;与之相…

香港Web3欲戴王冠,银行如何承受合规之重?

前言 6月19日&#xff0c;据明报报道&#xff0c;香港金融管理局&#xff08;HKMA&#xff09;总裁余伟文针对虚拟资产交易平台在香港银行开户难问题表示&#xff0c;一向有与香港银行有交流&#xff0c;“交流时是否有压力则大家感觉不一”。上周四&#xff0c;HKMA向汇丰银行…

vulhub-struts2-S2-005 远程代码执行漏洞复现

漏洞描述 s2-005漏洞的起源源于S2-003(受影响版本: 低于Struts 2.0.12)&#xff0c;struts2会将http的每个参数名解析为OGNL语句执行(可理解为java代码)。OGNL表达式通过#来访问struts的对象&#xff0c;struts框架通过过滤#字符防止安全问题&#xff0c;然而通过unicode编码(…

优维低代码实践:面包屑配置以及菜单配置

优维低代码技术专栏&#xff0c;是一个全新的、技术为主的专栏&#xff0c;由优维技术委员会成员执笔&#xff0c;基于优维7年低代码技术研发及运维成果&#xff0c;主要介绍低代码相关的技术原理及架构逻辑&#xff0c;目的是给广大运维人提供一个技术交流与学习的平台。 优维…

Pyinstaller打包Sklearn(即scikit-learn)+Pyqt5代码报错,程序无法正常运行

前言 在网上看了大部分解决办法都不能解决我的问题&#xff0c;后面自己摸索之后&#xff0c;解决问题&#xff0c;记录如下。 提供一篇大佬文章&#xff0c;一般能解决大部分问题&#xff1a; https://blog.csdn.net/u012219045/article/details/115397646 建议先看我的文章…

Java复习0619

关键字: static Static&#xff1a;静态的&#xff0c;随着类的加载而加载、执行。static用来修饰: 属性、方法、代码块、内部类熟悉: static修饰的类变量、类方法与不使用static修饰的区别。 类变量: 类的生命周期内&#xff0c;只有一个。被类的多个实例共享。 掌握: 我们遇…

企业备份和恢复软件推荐

数据备份是在发生灾难或事故时通过将数据从一个位置复制到另一个位置来保护数据的过程。数据是任何组织的生命线&#xff0c;丢失数据会导致严重损坏并中断业务运营。96% 的用户至少经历过数据丢失的主要原因之一&#xff1a;人为错误、硬盘驱动器故障、断电、火灾和自然灾害。…

ES(Elasticsearch)和Kibana(Windows)安装

安装Elasticsearch和Kibana 安装Elasticsearch过程 首先需要到官网下载安装包 注意&#xff1a;要下载对应的版本&#xff0c;如果下载最新版而且jdk是1.8版本的话&#xff0c;会出现warning: ignoring JAVA_HOMEC:\Program Files\Java\jdk1.8.0_191; using bundled JDK这样…

Git本地仓库使用

说明&#xff1a;Git是版本控制和协同开发的工具 下载Git 第一步&#xff1a;下载 在官网&#xff08;https://git-scm.com/download/win&#xff09;&#xff0c;选择自己的版本自行下载 第二步&#xff1a;安装 下载下来后&#xff0c;使用默认设置&#xff0c;不要改动任…

Redis6之配置文件与发布订阅

配置文件 ################################### NETWORK ############################## # 指定 redis 只接收来自于该IP地址的请求&#xff0c;如果不进行设置&#xff0c;那么将处理所有请求 bind 127.0.0.1#是否开启保护模式&#xff0c;默认开启。要是配置里没有指定b…

Java和bean(VO)、dao、Servlet、jsp的综合总结复习

学到这里&#xff0c;差不多&#xff0c;可以自主完成一个简单的系统了。所以接下来需要总结&#xff0c;然后设计一个简单的系统。分别使用Java和Java Web来实现。&#xff08;目标&#xff1a;实现简单的购物系统&#xff09; 要求&#xff1a;能注册&#xff0c;并登录。登…