类的加载器

A class loader is an object that is responsible for loading classes.
类加载器的主要作用就是加载Java类的字节码(class文件)到 JVM 中(在内存中生成一个该类的Class对象)
Every Class object contains a reference to the ClassLoader that defined it.

# JDK8
(无法直接访问)Bootstrap ClassLoader: 只负责加载JAVA_HOME/jre/lib下的类
(上级为Bootstrap)Extension ClassLoader: 只负责加载JAVA_HOME/jre/lib/ext下的类
(上级为Extension)AppClassLoader: 加载classpath下的类
(上级为Application)自定义类加载器: 自定义
#
默认创建的类都是由jdk.internal.loader.ClassLoaders$AppClassLoader来加载的
对于一个类加载器来说,相同二进制名称的类只会被加载一次
#
类加载的时候,先判断自己是否已经加载过,已加载过就会直接返回
自己没加载过,先委托给上级处理,上级处理不了(如 加载时找不到这个类或者ClassNotFoundException),则交由自己处理去加载

自定义加载器的话,需要继承ClassLoader。
不想打破双亲委派模型,就重写findClass()方法即可,无法被父类加载器加载的类最终会通过这个方法被加载。
想打破双亲委派模型则重写loadClass() 方法。

// BootstrapClassLoader是JVM自身的一部分,其他的ClassLoader都是在JVM外部实现的,并且都继承自ClassLoader抽象类

public static void main(String[] args) {
    // 注意: 因为使用的xxx.class,所以Tom类加载中的初始化步骤不会执行
    
    // jdk.internal.loader.ClassLoaders$AppClassLoader@3fee733d
    System.out.println(Tom.class.getClassLoader());
    // jdk.internal.loader.ClassLoaders$PlatformClassLoader@52cc8049(PlatformClassLoader是JDK9的,JDK8是ExtClassLoader)
    System.out.println(Tom.class.getClassLoader().getParent());
    // null(即 BootstrapClassLoader)
    System.out.println(Tom.class.getClassLoader().getParent().getParent());
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值