目录
- 1、Jvm内存结构概述
- 二、类加载器与类的加载过程
- 1、类加载器子系统的作用
- 2、类的加载过程
- 三、类加载器的分类
- 1、启动类加载器
- 2、扩展类加载器
- 3、应用程序类加载器
- 4、用户自定义加载器
- 5、获取ClassLoader的几种方式
- ==五、双亲委派机制==
- 1、什么是双亲委派机制
- 2、双亲委派机制的工作原理
- 3、demo验证
- 4、双亲委派机制的优势
- 5、沙箱安全机制
- 六、其他一些要点
- 1、判断JVM中两个class对象是否相等
- 2、对类加载器的引用
- 3、类的主动使用和被动使用
1、Jvm内存结构概述
二、类加载器与类的加载过程
1、类加载器子系统的作用
2、类的加载过程
三、类加载器的分类
如何获取四种类型的类加载器
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);}//从上面的路径中随意选择一个类,来看看他的类加载器是什么:扩展类加载器ClassLoader classLoader1 = CurveDB.class.getClassLoader();System.out.println(classLoader1);//sun.misc.Launcher$ExtClassLoader@1540e19d}
}
4、用户自定义加载器
1)为什么需要自定义类加载器
2)用户自定义类加载器的实现步骤
5、获取ClassLoader的几种方式
public class ClassLoaderTest2 {public static void main(String[] args) {try {//1. 获取java.lang.String的类加载器ClassLoader classLoader = Class.forName("java.lang.String").getClassLoader();System.out.println(classLoader);//2. 获取当前线程的类加载器ClassLoader classLoader1 = Thread.currentThread().getContextClassLoader();System.out.println(classLoader1);//3. 获取系统类加载器的父加载器ClassLoader classLoader2 = ClassLoader.getSystemClassLoader().getParent();System.out.println(classLoader2);} catch (ClassNotFoundException e) {e.printStackTrace();}}
}
五、双亲委派机制
1、什么是双亲委派机制
2、双亲委派机制的工作原理
3、demo验证
自定义一个 java.lang包,并在其中定义一个String类
在测试方法中加载该类:
结果: 静态代码块【System.out.println(“我是自定义的String类的静态代码块”);】没有执行,说明加载到内存中的并不是自定义的java.lang.String。由于双亲委派机制,实际上是通过引导类加载器加载的java核心类库中的String类
打印加载String类的加载器:结果是null,表明确实是引导类加载器
双亲委派机制:反向委派