首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DexClassLoader和PathClassLoader有什么不同?

DexClassLoader和PathClassLoader有什么不同?
EN

Stack Overflow用户
提问于 2016-05-18 17:57:29
回答 2查看 2.8K关注 0票数 3

我将一个包含.dex文件的.jar文件放到"/sdcard“目录下,然后尝试分别使用DexClassLoader和PathClassLoader加载.jar文件中的类。它们都可以成功地装入类。它们之间有什么不同?下面是我的代码:

代码语言:javascript
复制
String dexPath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "test.jar";
PathClassLoader classLoader1 = new PathClassLoader(dexPath, getClassLoader());
DexClassLoader classLoader2 = new DexClassLoader(dexPath, getDir("dex", 0).getAbsolutePath(), null, getClassLoader());
try {
     Class clazz1 = classLoader1.loadClass("com.focans.loader.Peter");
     Class clazz2 = classLoader2.loadClass("com.focans.loader.Peter");
} catch (Exception e) {
     e.printStackTrace();
}
EN

回答 2

Stack Overflow用户

发布于 2016-05-18 18:08:01

你应该阅读官方的指南关于

从包含classes.dex条目的.jar和.apk文件中加载类的类加载器。这可用于执行未作为应用程序的一部分安装的代码。

提供了一个简单的ClassLoader实现,该实现对本地文件系统中的文件和目录列表进行操作,但不会尝试从网络加载类。Android将这个类用于其系统类加载器和应用程序类加载器。

实例化DexClassLoader以从提取的二级dex文件加载库。

PathClassLoader用于在ant中使用与启动ant时不同的类路径加载类。请注意,即使某个类位于系统类路径中,也可以使用forceLoadClass方法强制该类进入此加载器。由该类加载的任何后续类都将使用此加载器,而不是系统类加载器。

票数 3
EN

Stack Overflow用户

发布于 2020-02-01 00:04:44

对于Android8.1(API27)和更高版本,DexClassLoaderPathClassLoader本质上是相同的。它们都extend BaseDexClassLoader,并在构造时立即调用super()。没有实现差异或副作用(至少在我这里引用的AOSP版本中)。

在以前的版本(8.0及更早版本)中,DexClassLoader接受String optimizedDirectory的参数,这允许调用者为类加载器加载的Dex指定存储优化的Dex代码(ODEX文件)的目录。这个论点仍然存在于更新版本的Android中,但它是has no effect的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37296192

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档