Android的类加载器
- ClassLoader
- BootClassLoader
- 预加载常用类,单例模式。与Java中的BootClassLoader不同,它并不是由C/C++代码实现,而是由Java实现的
- BaseDexClassLoader
- 是PathClassLoader、DexClassLoader、InMemoryDexClassLoader的父类,类加载的主要逻辑都是在BaseDexClassLoader完成的
- SecureClassLoaser
- 继承了抽象类ClassLoader,拓展了ClassLoader类。加入了权限方面的检查,加强了安全性,其子类URLClassLoader是用URL路径从jar文件中加载类和资源
- PathClassLoader
- 是android默认的类加载器,一个apk中Activity等类便是在其中加载
- DexClassLoader
- 可以加载任意目录下的dex/jar/apk/zip文件,比PathClassLoader更灵活,是实现插件化、热修复以及dex加壳的重点
- InMemoryDexCalssLoader
- 由android8.0新引入,从名字便可以看出是用于直接从内存中加载dex
code
File optfile=context.getDir("opt_dex",0);
File libfile=context.getDir("lib_path",0);
DexClassLoader dexClassLoader=new DexClassLoader(dexfilepath,optfile.getAbsolutePath(),
libfile.getAbsolutePath(),MainActivity.class.getClassLoader());
Class<?> clazz=null;
clazz = dexClassLoader.loadClass("类名");
Method testFuncMethod=clazz.getDeclaredMethod("testFunc");
Object obj=clazz.newInstance();
testFuncMethod.invoke(obj);