我将包含.dex文件的.jar文件放到目录" / sdcard",然后我尝试分别使用DexClassLoader和PathClassLoader在.jar文件中加载该类。它们都可以成功加载类。他们之间有什么区别? 这是我的代码:
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();
}
答案 0 :(得分:2)
您应该阅读官方的指南
<强> DexClassLoader 强>
从.jar和.apk文件加载类的类加载器 一个classes.dex条目。这可用于执行未安装的代码 申请的一部分。
<强> PathClassLoader 强>
实例化提供一个在列表上运行的简单ClassLoader实现 本地文件系统中的文件和目录,但没有 尝试从网络加载类。 Android使用此类 它的系统类加载器及其应用程序类加载器。
DexClassLoader 以从提取的辅助dex文件加载库。
PathClassLoader 用于在ant中加载类,其路径与用于启动ant的类路径不同。请注意,即使该类在系统类路径上使用forceLoadClass方法,也可以强制类进入此加载器。然后,该类加载的任何后续类将使用此加载器而不是系统类加载器。
答案 1 :(得分:2)
对于Android 8.1(API 27)及更高版本,DexClassLoader和PathClassLoader基本相同。它们既extend
BaseDexClassLoader
,又在构造时立即调用super()
。没有实现上的差异或副作用(至少在我这里引用的AOSP版本中)。
在以前的版本(8.0和更早版本)中,DexClassLoader
接受了String optimizedDirectory
的参数,该参数允许调用者为存储的Dex指定目录来存储优化的Dex代码(ODEX文件)。由类加载器。此参数在更新的Android版本中仍然存在,但has no effect。