一句话说明类加载过程和几种类加载器及双亲委派机制

    前文说到了java内存模型,不由得联想到jvm运行程序时的类加载机制,程序写好后会被虚拟机编译成字节码文件,这样能被计算机识别,因为计算机只识别二进制的指令;然后程序运行时,就会先通过类加载器加载编译后的类字节码然后运行;首先简短说明类加载的过程:加载、链接(验证、准备、解析)、初始化,加载完毕后就可以运行了;然后说明jvm的几种类加载器,类加载器有四种如下:

 

1、Bootstrap ClassLoader (引导类加载器)

负责加载$JAVA_HOME中jre/lib/rt.jar里所有的class,由C++实现的核心库,也就是JVM调用每个系统的API实现系统功能,实现跨平台的主要模块,不是ClassLoader子类。开发者不能直接使用;

2、Extension ClassLoader (扩展类加载器)

负责加载java平台中扩展功能的一些jar包,包括$JAVA_HOME中jre/lib/*.jar或-Djava.ext.dirs指定目录下的jar包,开发者可以直接使用;

3、Application ClassLoader (应用加载)

负责记载classpath中指定的jar包及目录中class。根据需要,通过class的全限定名来加载类,可以通过classLoader.getSystemClassLoader()来获取它;

4、Custom ClassLoader (用户加载器)

属于应用程序根据自身需要自定义的ClassLoader,继承java.lang.classLoader类。如tomcat、jboss都会根据j2ee规范自行实现ClassLoader;

然后要注意类加载中有个知识点:双亲委派机制,含义就一个类加载器加载类时,会先委托其上级类加载器去加载同样名称的类,如果加载不到,在自己加载;其作用就是,比如你自己写了一个名称和api类名一样的类,然后你用类加载器去加载这个类名的类,那么到底是加载哪个类呢,就是说当你自己写的类和api的类名冲突时,jvm会加载java的api类,而不是加载你写的那个,就是这个道理;类加载的说这么几个关键知识点就够了,实际开发中用到的很少,主要还是用于一个知识体系的支撑,然后双亲委派机制可以让你清楚,如果写个和jvm自带类同名的类会怎样调用,然后你可以运用自定义类加载器,自己写个类加载器,加载你写在某个路径下的类,用以在类不方便直接注入或某种场景无法注入spring框架而加载不到的情况~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值