双亲委派机制

一、类加载器

1、是什么

Java类加载器(Java Classloader)是Java运行时环境(Java Runtime Environment)的一部分, 负责动态加载Java类到Java虚拟机的内存空间中。

2.有哪些

java默认有三种类加载器,BootstrapClassLoader、ExtensionClassLoader、App ClassLoader。
BootstrapClassLoader(引导启动类加载器): 嵌在JVM内核中的加载器,该加载器是用C++语言写的,主要负载加载JAVA_HOME/lib下的类库,引 导启动类加载器无法被应用程序直接使用。
ExtensionClassLoader(扩展类加载器): ExtensionClassLoader是用JAVA编写,且它的父类加载器是Bootstrap。 是由sun.misc.Launcher$ExtClassLoader实现的,主要加载JAVA_HOME/lib/ext目录中的类 库。 它的父加载器是BootstrapClassLoader
App ClassLoader(应用类加载器): App ClassLoader是应用程序类加载器,负责加载应用程序classpath目录下的所有jar和class文 件。它的父加载器为Ext ClassLoader
在这里插入图片描述

二、双亲委派模型

1.介绍

we
图片转自: 文章
类通常是按需加载,即第一次使用该类时才加载。由于有了类加载器,Java运行时系统不需要知道文件与 文件系统。学习类加载器时,掌握Java的委派概念很重要。
双亲委派模型:如果一个类加载器收到了一个类加载请求,它不会自己去尝试加载这个类,而是把这个请求 转交给父类加载器去完成。每一个层次的类加载器都是如此。
因此所有的类加载请求都应该传递到最顶层的 启动类加载器中,只有到父类加载器反馈自己无法完成这个加载请求(在它的搜索范围没有找到这个类) 时,子类加载器才会尝试自己去加载。委派的好处就是避免有些类被重复加载。
note
1.所有类都会先被送到顶层的Bootstrap类加载器,并在这个过程中判断是否已经被加载。
2.从顶层向下尝试加载,一旦可以加载,就由这一层加载,并退出。

2.类加载方式

① 显示加载

classloader.loadClass( className)
Class.forName( className)

② 隐式加载

3.好处和例子

1)避免类的重复加载
2)保护程序安全,防止核心API被随意篡改
例子

  1. idea在src目录下创建java.lang包,然后在这个包里面创建一个名为String的类。
    在这里插入图片描述
    String类内容如下:
package java.lang;
public class String {
    static {
        System.out.println("my String loaded");
    }
}
  1. 测试类
public class Test {
    public static void main(String[] args) throws ClassNotFoundException {
        String s = new java.lang.String();
        System.out.println("完成");
        Class.forName("java.lang.String");
    }
}

运行结果:
在这里插入图片描述
自定义String的静态代码块没有执行,说明它没有被加载,应证了保护核心API的优点。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值