Java中的类加载器

什么是类加载器
1.类加载器负责将.class文件 (存储在硬盘中的物理文件) 加载到内存中。

类加载器
1.类加载时机:用到就加载,不用不加载

  1. 创建类的实例化对象时。
  2. 调用类的类方法(静态方法)时。
  3. 访问类或者接口的类变量,或者为该类变量赋值时。(类变量指静态变量)
  4. 使用反射方式来强制创建某个类或接口对应的java.lang.Class对象时。
  5. 初始化某个类的子类。
  6. 直接使用java.exe命令来运行某个主类。

2.类加载过程:

  1. 加载:通过包名+类名获取这个类,准备用流进行传输。将这个类通过流加载到内存中,加载完毕创建一个Class对象。
  2. 链接:
    1.验证:链接的第一步,这一阶段为了确保Class文件字节流中包含的信息符合虚拟机的要求,并且不会威胁到虚拟自身安全。
    2.准备:负责为类变量(静态变量)分配内存,并初始化其值。
    3.解析:将二进制数据流中的符号引用替换为直接引用。(也就是找到本类中用到其他类的实际位置)
  3. 初始化:静态变量赋值以及初始化其他资源。

3.类加载器的分类:

  1. 启动类加载器:BootStarapClassLoader 虚拟机内置的类加载器。
  2. 平台类加载器:PlatformClassLoader 负责加载JDK中的一些特殊的模块。
  3. 系统类加载器:SystemClassLoader 加载用户类路径上所指定的类库。(一般自己写的类都是通过该加载器加载到内存中的)
  4. 自定义类加载器:UserClassLoader。(从1到4是父到子的关系)

4.类加载器的双亲委派模型:
在这里插入图片描述
子加载器首先会委托父加载器加载字节码文件,因此所有的加载器最终都会传递到启动类加载器,当父类加载器不能加载时会向下委派,然后子类才会尝试自己去加载。

// 获取系统加载器
        ClassLoader classLoader = ClassLoader.getSystemClassLoader();

        // 获取系统加载器的父类加载器
        ClassLoader classLoader1 = classLoader.getParent();

        // 获取平台加载器的父加载器
        ClassLoader classLoader2 = classLoader1.getParent();

        System.out.println("系统类加载器" + classLoader);
        System.out.println("平台类加载器" + classLoader1);
        System.out.println("启动类加载器" + classLoader2);

类加载器ClassLoader的常用方法
1.public static ClassLoader getSystemClassLoader() // 获取系统类加载器。
2.public InputStream getResourceAsStream(String name) // 加载某一个资源文件。参数为资源路径。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值