ClassLoader详解
ClassLoader种类
- BootClassLoader :加载系统Framework层级需要的类
- PathClassLoader:应用启动时创建,用于加载.apk里的类
- DexClassLoader
- BaseDexClassLoader
运行一个APP至少有两个Classloader
。
双亲代理模式
创建一个classloader示例,需要一个classloader作为其parent,所以整个Android系统的classloader就是一课树。
初始化一个classloader,以下来自Android API27源码ClassLoader.java
:
protected Class<?> loadClass(String name, boolean resolve)
throws ClassNotFoundException
{
// First, check if the class has already been loaded
Class<?> c = findLoadedClass(name);
if (c == null) {
try {
if (parent != null) {
c = parent.loadClass(name, false);
} else {
c = findBootstrapClassOrNull(name);
}
} catch (ClassNotFoundException e) {
// ClassNotFoundException thrown if class not found
// from the non-null parent class loader
}
if (c == null) {
// If still not found, then invoke findClass in order
// to find the class.
c = findClass(name);
}
}
return c;
}
通过给定指定的name加载class
- 检查是否已经被加载过
- 检查父类class loader是否已经加载了,如果父类是空的,则用虚拟机代替
- 调用
findClass(String)
方法找到class
这样的检测是可以保证一些Framework层级的类一旦被顶层的ClassLoader加载过就会缓存在内容中,以后任何地方使用都不需要重新加载。
这样做还可以防止用户自定义的类型冒充了核心代码而造成安全问题。
是同一个类的条件:
- 相同class name
- 相同package name
- 相同的class loader加载
网友评论