JAVA类加载浅谈

[b]类加载器[/b]
1. 引导类加载器
负责加载系统的内核文件,如 java.lang、java.util包等
搜录路径为: JAVA_HOME/jre/lib 及 JAVA_HOME/lib

2. 扩展类加载器
负责加载JDK的扩展包,搜寻路径为:JAVA_HOME/jre/lib/ext

3. 系统类加载器
负责加载用户的自定义类型;

4. 自定义类加载器
根据业务规则来加载

各种类加载器的关系:
引导类加载器
|
扩展类加载器
|
系统类加载器
|
自定义类加载器


相关API:
java.lang.Class
getClassLoader() --> ClassLoader
java.lang.ClassLoader
getParent() --> ClassLoader
loadClass(String name, boolean resolve)
findLoadClass(String name);
findClass(String);
defineClass(String name, byte[] buf, int off, int len);

[b]类加载的原理:[/b]
1.所有类的加载都会递归地调用父类的类加载器来加载类, 采用的是一种代理的方式
如下:
比如, JVM现在在加载 org.example.Student 这个类, 则首选会加载 Object类, 因为任何类都继承于 java.lang.Object
而Student的类加载器,在默认情况下为sun.misc.Lanucher$AppClassLoader, 依据代理方式 ,它会先去代理给父类的加载器【扩展,再到引导】
由父类加载器尝试去加载 Object, Student, 当然, 引导类加载器可以加载到 Object类,但加载不到 Student, 所以,最终, Student会被 应用类加载器所加载;

2. 类加载器 ClassLoader 加载类时,调用方法的顺序为:
首先根据完整的全限定名 去调用 loadClass 方法 【此方法实现了 代理的方式,会依次代理给父类加载器】
在loadClass方法内会调用 findLoadClass, 来查找此类之前是否已加载过, 如果有,则返回,如果没有,则调用
findClass 方法去查找, 【ClassLoader默认情况下会依据 classpath环境变量来查找】
最后调用 defineClass 把字节码转换成 java.lang.Class的一个实例;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值