通过源码分析类加载器里面可以加载的类

类列表

  每一个ClassLoader里面的类列表,类的数量都是固定的。

对上一节中的dex反编译

  使用DexClassLoader类动态加载插件dex
  利用jadx对dex进行反编译可以看到有哪些类

在这里插入图片描述

源码分析

  • BaseDexClassLoader
    BaseDexClassLoader类加载器开始分析
    BaseDexClassLoader类里有一个pathList属性,它的类型是DexPathList,分析DexPathList类的定义
    在这里插入图片描述

  • DexPathList
    DexPathList类里有一个dexElements属性,它是Element类型,分析Element类的定义
    在这里插入图片描述

  • Element
    Element类是DexPathList的内部类,它有一个属性是dexFile,它是DexFile类型,分析DexFile类的定义

    在这里插入图片描述

  • DexFile
    DexFile里找到一个方法getClassNameList(),获取类名,它需要一个参数cookie
    在这里插入图片描述
    cookie参数就是DexFile类的属性mCookie了在这里插入图片描述
    接下来通过反射调用getClassNameList()方法就可以得到类加载器可以加载的类了。

代码

public static void getClassListInClassLoader(ClassLoader classLoader) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {// 获取BaseDexClassLoader类Class BaseDexClassLoaderClass=Class.forName("dalvik.system.BaseDexClassLoader");// 获取BaseDexClassLoader类中的pathList字段Field pathListField = BaseDexClassLoaderClass.getDeclaredField("pathList");// 设置权限pathListField.setAccessible(true);// 从传进去的参数classLoader加载器对象中获取pathList对象Object pathListobj = pathListField.get(classLoader);// 获取DexElemtnt类Class DexElemtntClass = Class.forName("dalvik.system.DexPathList");// 获取DexElemtnt类中的dexElements字段Field dexElements = DexElemtntClass.getDeclaredField("dexElements");// 设置权限dexElements.setAccessible(true);//  pathList对象中获取dexElements对象Object[] dexElementsArratobj = (Object[]) dexElements.get(pathListobj);// 获取Element内部类Class ElementClass = Class.forName("dalvik.system.DexPathList$Element");// 从Element内部类中获取字段dexFileField dexFileField = ElementClass.getDeclaredField("dexFile");设置权限dexFileField.setAccessible(true);  // 取消权限检查// 获取DexFile类Class DexFileClass = Class.forName("dalvik.system.DexFile");// 从DexFile类中获取字段mCookie Field mCookieField = DexFileClass.getDeclaredField("mCookie");// 设置权限mCookieField.setAccessible(true);// 获取字段mFileNameField mFIleNameField = DexFileClass.getDeclaredField("mFileName");// 设置权限mFIleNameField.setAccessible(true);// 从DexFile类中获取getClassNameList方法Method getClassNameListMethod = DexFileClass.getDeclaredMethod("getClassNameList",Object.class);// 设置权限getClassNameListMethod.setAccessible(true);// 遍历dexElements,dexElement里面有dexFilefor(Object dexElementobj:dexElementsArratobj){// 获取dexfile对象Object dexfileObj = dexFileField.get(dexElementobj);// 获取mCookie对象Object mCookieobj = mCookieField.get(dexfileObj);// 获取mFileName对象String mFileNameobj = (String) mFIleNameField.get(dexfileObj);// 调用getClassNameList方法获取类列表String[] classList = (String[]) getClassNameListMethod.invoke(null,mCookieobj);for(String classname:classList){// 打印信息Log.e("classlist",classLoader.toString()+"---"+mFileNameobj+"---"+classname);}}
}

调用getClassListInClassLoader()

getClassListInClassLoader(dexClassLoader)
成功获取到了dexClassLoader类加载器中可以加载的类
在这里插入图片描述

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

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

相关文章

力扣11.3

1981. 最小化目标值与所选元素的差 给你一个大小为 m x n 的整数矩阵 mat 和一个整数 target 。 从矩阵的 每一行 中选择一个整数,你的目标是 最小化 所有选中元素之 和 与目标值 target 的 绝对差 。 返回 最小的绝对差 。 a 和 b 两数字的 绝对差 是 a - b 的…

宝塔使用clickhouse踩坑

前言 最近有个物联网项目,需要存储物联网终端发送过来的信息(类似log日志,但又要存储在数据库里,方便后期聚合统计),本来想写文件的奈何客户要求聚合统计,所以只能用数据库才能达到更高的计算效…

parted 磁盘分区

目录 磁盘格式磁盘分区文件系统挂载使用扩展 - parted、fdisk、gdisk 区别 磁盘格式 parted /dev/vdcmklabel gpt # 设置磁盘格式为GPT p # 打印磁盘信息此时磁盘格式设置完成! 磁盘分区 开始分区: mkpart data_mysql # 分区名&…

NFTScan Site:以蓝标认证与高级项目管理功能赋能 NFT 项目

自 NFTScan Site 上线以来,它迅速成为 NFT 市场中的一支重要力量,凭借对各类 NFT 集合、市场以及 NFTfi 项目的认证获得了广泛认可。这个平台帮助许多项目提升了曝光度和可见性,为它们在竞争激烈的 NFT 市场中创造了更大的成功机会。 在最新更…

统计数据集的TXT、XML及JSON标注文件中各类别/每个标签的数量

在计算机视觉和深度学习领域,标注文件是模型训练的重要组成部分。无论是图像分类、目标检测还是图像分割,正确的标注能够显著提升模型的性能。在实际应用中,我们需要快速了解每个类别的样本数量,以便进行数据分析、平衡类别分布或…

leetcode-5-最长回文子串

题解: 回文串:如果一个字符串正着读和反着读都是一样的那这个字符串就是回文串。 对于一个子串而言,如果它是回文串,并且长度大于 2,那么将它首尾的两个字母去除之后,它仍然是个回文串。 1、初始化字典d…

深入了解 Flutter 中的泛型:让代码更灵活更安全的关键

目录 前言 一、泛型类 二、泛型方法 三、泛型约束 四、Flutter 中泛型的实际应用 前言 泛型(Generics)是编程语言中一种关键机制,它允许我们在类、接口、方法等结构中使用类型参数,而不必指定具体的类型。在 Flutter 中&…

移动混合开发面试题及参考答案

目录 什么是混合开发(Hybrid App)? 混合开发(Hybrid App)与原生开发相比有什么优缺点? 优点 缺点 混合开发(Hybrid App)的兴起原因是什么? 市场竞争和成本控制需求 技术发展和资源整合 人才资源的考量 Web App、Native App 和混合开发(Hybrid App)的区别是…

mysql5安装

1.下载安装包 https://downloads.mysql.com/archives/community/ mysql-5.7.44-1.el7.x86_64.rpm-bundle.tar tar -xvf mysql-5.7.44-1.el7.x86_64.rpm-bundle.tar2.安装依赖 yum -y install perl yum -y install net-tools yum install numactl libaio libaio-devel -y也可…

【工具变量】“宽带中国”试点城市名单匹配数据集(2000-2023年)

参照秦文晋(2022)的《网络基础设施建设对数字经济发展的影响研究——基于"宽带中国"试点政策的准自然实验》一文中的做法,将选为“宽带中国”试点城市的虚拟变量作为核心解释变量,当一个城市被批复成为“宽带中国”试点…

php内置服务停止shell小工具,用来停止指定的端口的php内置服务进程

最近vscode总是喜欢闪退,这导致了上面启动的php内置服务变成了无法管理状态,所以就有了这个工具来停止相关的PHP内置服务进程. 将下面的代码保存到本地合适的位置,并命名为 stop.sh #!/bin/bash # Author: tekintian # Date: 2024-11-02 …

Servlet 3.0 注解开发

文章目录 Servlet3.0注解开发修改idea创建注解的servlet模板内容讲解 关于servlet3.0注解开发的疑问_配置路径省略了属性urlPatterns内容讲解内容小结 Servlet3.0注解开发 【1】问题 说明:之前我们都是使用web.xml进行servlet映射路径的配置。这样配置的弊端&…

力扣每日一题——数组能够形成多少对

目录 题目链接:2341. 数组能形成多少数对 - 力扣(LeetCode) 题目描述 解法一:List集合 Java写法: 运行时间 C写法: 解法二:Set集合 Java写法: 运行时间 C写法 上述两种方法…

开源项目-投票管理系统

哈喽,大家好,今天主要给大家带来一个开源项目-投票管理系统 投票管理系统主要有首页,发起投票,管理投票,参与投票,查看投票等功能 首页 为用户提供了一键导航到各个功能模块的便捷途径。 新增投票 用户可以在此轻松创建新的投票活动,设置投票主题、选项等信息。 管理…

高级java每日一道面试题-2024年10月27日-Redis篇-jedis和redisson有哪些区别?

如果有遗漏,评论区告诉我进行补充 面试官: jedis和redisson有哪些区别? 我回答: 在Java高级面试中,Jedis和Redisson的区别是一个常见且重要的话题。以下是对这两个Java客户端库的详细对比: 设计思想与实现方式 Jedis: 设计思想&#xff…

[Python]K小姐经营着一家蛋糕店,她的蛋糕店有 n 种口味的蛋糕。这 n 种口味的蛋糕在 A 工厂和 B 工厂都有生产。

问题来源:【秋招突围】2024届秋招-京东笔试题-第三套_牛客网 问题描述 K小姐经营着一家蛋糕店,她的蛋糕店有 n种口味的蛋糕。这 n 种口味的蛋糕在 A 工厂和 B 工厂都有生产。 对于每种口味的蛋糕,如果 A 工厂生产的口感值为 AiA_iAi​&…

设计模式讲解01-建造者模式(Builder)

1. 概述 建造者模式也称为:生成器模式 定义:建造者模式是一种创建型设计模式,它允许你将创建复杂对象的步骤与表示方式相分离。 解释:建造者模式就是将复杂对象的创建过程拆分成多个简单对象的创建过程,并将这些简单…

【Python ASR 】模型对比 whisper 和 funasr

【Python ASR 】模型对比 模型差异比较大的几段结果最后相关网站 模型 Paraformer-zh(离线免费-推荐) 语音识别,带时间戳输出,非实时 SenseVoiceSmall(离线免费) 多种语音理解能力,涵盖了自动语…

Python爬虫抓取三个网站上的英语每日一句

一、引言 大学英语学习需要巩固高中语法,补充四六级词汇,增加英语语感,提升英语的运用能力。学好英语有很多种方法,采用句子来突破英语语法、词汇、口语和听力的方法简单有效,值得提倡。李阳就是采用这种方法来教授英…

PostgreSQL 学习笔记:PostgreSQL 主从复制

PostgreSQL 笔记:PostgreSQL 主从复制 博客地址:TMDOG 的博客 在现代应用程序中,数据库的高可用性和扩展性是至关重要的。PostgreSQL 提供了主从复制功能,可以在多个数据库实例之间复制数据,以实现冗余和负载均衡。本…