

Class file存储于硬盘上,相当于一个模板,用于将这个模板在执行时加载到JVM中来根据此文件可实例化很多实例。class file加载到JVM中,被称为DNA元数据模板,放在方法区。在.class文件->JVM->最终成为元数据模板,过程中需要进行数据的运输,而ClassLoader就扮演成此角色。

虚拟机自带的加载器
sun.misc.Launcher$ExtClassLoader@7ea987ac
sun.misc.Launcher$AppClassLoader
System.out.println("********启动类加载器********");
//获取BootstrapClassLoader能够加载的api的路径
URL[] urls=sun.misc.Launcher.getBootstrapClassPath().getURLs();
for (URL element : urls) {
System.out.println(element.toExternalForm());
}
//从上面的路径中随意选择一个类,来看看他的类加载器是什么:引导类加载器
ClassLoader classLoader = Provider.class.getClassLoader();
System.out.println(classLoader);
System.out.println("--------------------------------------------------------------------------");
System.out.println("********扩展类加载器********");
//
String extDirs=System.getProperty("java.ext.dirs");
for (String path : extDirs.split(";")) {
System.out.println(path);
}
//从上面的路径中随意选择一个类,来看看他的类加载器是什么:sun.misc.Launcher$ExtClassLoader@7ea987ac 扩展类加载器
ClassLoader classLoader1 = CurveDB.class.getClassLoader();
System.out.println(classLoader1);
}
除了上诉三种加载器还存在用户自定义加载器,还存在自定义加载类
ClassLoader类,它是一个抽象类,其后所有的类加载器都继承自ClassLoader(不包括启动加载器)

java 虚拟机对class文件采用的是按需加载的方式,也就是说当需要使用该类时才会将它的class文件加载到内存生成class对象。而且加载某个类的class文件时,Java虚拟机采用的是双亲委派机制,即把请求交由父类处理,它是一种任务委派模式。
机制工作原理

注意访问顺序:首先访问先问问引导类加载器,如果不管就是拓展类加载器,如果还不管就是系统类加载器,而自定义类加载器是最后出现的。
俗话说:小孩拿到一个苹果,出于礼貌首先会问妈你吃吗?(拓展类加载器),孩儿妈处于礼貌就是问孩儿奶奶说妈你吃吗?(引导类加载器)。接着孩儿奶说不吃那么就需要判断孩儿妈吃不吃,如果孩儿妈也不吃那么就说孩儿自己吃(系统类加载器)特别注意苹果不可以分哟
package java.lang; //注意这是设定的系统目录
/**
* Author:梦醒
* Date: 2022/7/16 17:23
* Dream:
* 信言不美,美言不信。
* 善者不辩,辩者不善。
* 知者不博,博者不知。
* Function:
*/
public class ShkStart {
public static void main(String[] args) {
System.out.println("hello");
}
}
报错:java.lang.SecurityException: Prohibited package name: java.lang
自定义String类,但是在加载自定义String类的时候会率先使用引导类加载器加载,而引导类加载器在加载的过程中会先加载jdk自带的文件(rt.jar包中java\lang\String.class),报错信息说没有main方法,就是因为加载的是rt.jar包中的String类。这样可以保证对Java核心源代码的保护,这就是沙箱安全机制