现在我们编写一个类,为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 系统类加载器 ,如果可以就成功加载,如果不可以,就没得办法。