谈谈你对类加载机制的理解

现在我们编写一个类,为java.lang.String类,实际运行是否能替换JDK的String?

jdk类加载机制
1.Java源文件----编译--->.class文件
2.类加载器ClassLoader会读取这个.class文件,并且转化为java.lang.Class的实例。有了该实例,JVM就可以使用它来创建对象,调用方法等操作了。

class文件的来源?
1.java内部核心类,位于$JAVA_HOME/jre/lib , 其中最著名的就是rt.jar
2.java的扩展类,位于$JAVA_HOME/jre/lib/ext目录下
3.我们开发的类或项目开发用到的第三个jar,位于项目目录下,WEB-INF/lib目录,但是maven不同。

JDK怎么分工的?谁来加载这些Class?
1.java核心类,由一个名为BootstrapClassLoader加载器负责加载。这个类加器被称为,”根加载器或者引导加载器“。
2.java扩展类,是由ExtClassLoader负责加载,被称为”扩展类加载器“
3.项目编写的类,是由AppClassLoader负责加载,“系统类加载器”。

尝试

package java.lang;
public class String {
	public String() {
		System.out.println("自己的String");
	}
}

在空包下 写了一个
public class StringTest {
	public static void main(String[] args) {
		new String();
	}
}
测试结果为

在这里插入图片描述
并没有想我像我预期所想的那样

双亲委托机制

在这里插入图片描述
1.当我们需要加载一个自己编写的类的时候需要加载的时候,首先会丢给AppClassLoader 进行加载
2.但是AppClassLoader 会丢给ExtClassLoader
3.ExtClassLoader又会丢给BootstrapClassLoader
4.当BootstrapClassLoader 根加载器 无法加载,就会丢给ExtClassLoader 扩展类加载器
5.当 扩展类加载器 也无法操作,就往下丢给 AppClassLoader 系统类加载器 ,如果可以就成功加载,如果不可以,就没得办法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只小小狗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值