双亲加载机制
1. 三个加载器
Bootstrapclassloader启动类加载器存在于java虚拟机的内核中,它由C++代码实现所以没有java的字节码,虚拟机启动的时候就会启动该加载器,它负责它负责将 /lib下面的类库加载到内存中(比如rt.jar)。由于引导类加载器涉及到虚拟机本地实现细节,开发者无法直接获取到启动类加载器的引用,所以不允许直接通过引用进行操作。
Extensionclassloader标准扩展类加载器负责搜寻JRE所在目录的lib/ext 目录下的classes或.jar中是否有指定的类别并加载(实际上是由系统参数java.ext.dirs指定);
AppClassLoader则搜寻 Classpath中是否有指定的classes并加载(由系统参数java.class.path指定)
appclassloader的parent是extensionclassloader,而extensionclassloader的parent是bootstrapclassloader
2. 双亲委派机制
某个特定类加载器在接到加载类的请求时,就会逐级向上递归查找parent类加载器是否加载过这个类,如果找到顶都没有加载过才是尝试亲自加载该类,如果自己也找不到加载资源就抛出NoClassDefFoundError,每个Class的实例都会记得是哪个ClassLoader加载它的,可以由Class的getClassLoader()取得加载该类别的ClassLoade
3. 双亲加载机制的意义
避免同一个类被重复加载,我们可以利用这个类加载机制来实现一个自定义的类加载器来加载诸如自定义的java.lang.System类等奇巧淫技。但是,在JVM中,判断一个对象是否是某个类型时,如果该对象的实际类型与待比较的类型的类加载器不同,那么会返回false。