02_类加载子系统
- 一、内存结构概述
- 二、类加载器与类的加载过程
- 1、类加载器子系统的作用
- 2、类加载器ClassLoader的作用
- 3、类的加载过程
- 三、类加载器的分类
- 1、启动类加载器
- 2、扩展类加载器
- 3、应用程序类加载器
- 4、自定义类加载器
- 5、获取ClassLoader的几种方式
- 五、双亲委派机制
- 1、什么是双亲委派机制
- 2、双亲委派机制的工作原理
- 3、demo进行佐证
- 4、双亲委派机制的优势
- 5、沙箱安全机制
- 六、其他一些要点
- 1、JVM中两个class对象是否相等
- 2、对类加载器的引用
- 3、类的主动使用和被动使用
一、内存结构概述
- 类加载器子系统
- 运行时数据区
- 执行引擎
二、类加载器与类的加载过程
1、类加载器子系统的作用
2、类加载器ClassLoader的作用
3、类的加载过程
1)加载
2)链接
3)初始化
三、类加载器的分类
public class ClassLoaderTest {
public static void main(String[] args) {
//获取系统类加载器
ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
System.out.println(systemClassLoader);//sun.misc.Launcher$AppClassLoader@18b4aac2
//获取其上层:扩展类加载器
ClassLoader extClassLoader = systemClassLoader.getParent();
System.out.println(extClassLoader);//sun.misc.Launcher$ExtClassLoader@1540e19d
//获取其上层:获取不到引导类加载器
ClassLoader bootstrapClassLoader = extClassLoader.getParent();
System.out.println(bootstrapClassLoader);//null
//对于用户自定义类来说:默认使用系统类加载器进行加载
ClassLoader classLoader = ClassLoaderTest.class.getClassLoader();
System.out.println(classLoader);//sun.misc.Launcher$AppClassLoader@18b4aac2
//String类使用引导类加载器进行加载的。---> Java的核心类库都是使用引导类加载器进行加载的。
ClassLoader classLoader1 = String.class.getClassLoader();
System.out.println(classLoader1);//null
}
}
1、启动类加载器
2、扩展类加载器
3、应用程序类加载器
public class ClassLoaderTest1 {
public static void main(String[] args) {
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("***********扩展类加载器*************");
String extDirs = System.getProperty("java.ext.dirs");
for (String path : extDirs.split(";")) {
System.out.println(path);
}
}
}
4、自定义类加载器
5、获取ClassLoader的几种方式
五、双亲委派机制
1、什么是双亲委派机制
2、双亲委派机制的工作原理
3、demo进行佐证
自定义一个 java.lang包,并在其中定义一个String类
在测试方法中加载该类:
结果: 静态代码块【System.out.println(“我是自定义的String类的静态代码块”);】没有执行,说明加载到内存中的并不是自定义的java.lang.String。由于双亲委派机制,实际上是通过引导类加载器加载的java核心类库中的String类
打印加载String类的加载器:结果是null,表明确实是引导类加载器