java类加载器与双亲委派机制详解
1. java类加载过程
类加载器java.lang.ClassLoader:
负责查找、加载、校验字节码的应用程序
- load(String className) 根据名字加载一个类,返回类的实例
- defineClass(String name, byte[] b, int off, int len) 将一个字节流定义一个类
- findClass(String name) 查找一个类
- findLoadedClass(String name) 在已加载的类中,查找一个类
- 成员变量 ClassLoader parent;
JVM四级类加载器:
- 启动类加载器(Bootstrap),C语言编写,负责加载核心Java Class
- 扩展类加载器(Extension),jre/lib/ext
- 应用类加载器(App),classpath
- 用户自定义加载器(Plugin),程序自定义,通过继承ClassLoader父类来创建自己的类加载器
2. 双亲委托模型
protected Class<?> loadClass(String name, boolean resolve)
throws ClassNotFoundException
{
synchronized (getClassLoadingLock(name)) {
// First, check if the class has already been loaded
Class<?> c = findLoadedClass(name);//首先查找这个类是否被加载
if (c == null) {
if (parent != null) {
c = parent.loadClass(name, false);//调用他的父加载器进行类加载,进行递归调用
} else {
c = findBootstrapClassOrNull(name);//由bootStrap类加载
}
if (c == null) {
// If still not found, then invoke findClass in order
// to find the class.
long t1 = System.nanoTime();
c = findClass(name);//查找自己的类加载器能否加载此类,如果有则加载,给c赋值,c不为空,所以结束各层的调用
}
}
if (resolve) {
resolveClass(c);
}
return c;
}
}