1、内存结构概述
2、类加载器与类的加载过程
类加载器:
类的加载过程:
3、类加载器分类
package com.szu.chen;
import org.junit.Test;
import javax.xml.transform.Source;
/**
* @author chen
* @create 2020-08-16 18:58
*/
/*
两种类型的类加载器:引导类加载器(Bootstrap ClassLoader) 和 自定义类加载器(User-Defined ClassLoader)
引导类加载器(Bootstrap ClassLoader) <--- 扩展类加载器(Extension ClassLoader)<--- 系统类加载器System ClassLoader
自定义类加载器:JVM将所有派生于抽象类ClassLoader的类加载器都划分为自定义类加载器
*/
public class ClassLoaderTest {
public static void main(String[] args) {
// 获取系统类加载器:AppClassLoader
ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
//sun.misc.Launcher$AppClassLoader@b4aac2
System.out.println(systemClassLoader);
// 获取其上层:扩展类加载器:sun.misc.Launcher$ExtClassLoader@16f6e28
ClassLoader extClassLoader = systemClassLoader.getParent();
System.out.println(extClassLoader);
// 再获取其上层: null,获取不到引导类加载器
ClassLoader bootstrapClassLoader = extClassLoader.getParent();
System.out.println(bootstrapClassLoader);
// 对于用户自定义类来说:默认使用系统类加载器进行加载
System.out.println(ClassLoaderTest.class);
ClassLoader classLoader = ClassLoaderTest.class.getClassLoader();
// sun.misc.Launcher$AppClassLoader@b4aac2
System.out.println(classLoader);
// String类使用引导类加载器进行加载的。 ---> Java核心类库都是使用引导类加载器加载的。
System.out.println(String.class);
System.out.println(String.class.getClassLoader());
}
}
4、ClassLoader的使用说明
ClassLoader的常用方法及其获取方法
package com.szu.chen2;
/**
* @author chen
* @create 2020-08-17 9:08
*/
public class ClassLoaderTest {
public static void main(String[] args) {
try {
//1. 获取当前类的ClassLoader:启动类加载器
ClassLoader classLoader = Class.forName("java.lang.String").getClassLoader();
System.out.println(classLoader);
//2.获取当前线程上下文的ClassLoader:系统类加载器
ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
System.out.println(contextClassLoader);
//3.1 获取系统类加载器
ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
System.out.println(systemClassLoader);
//3.2 获取系统类加载器上一级:扩展类加载器
ClassLoader parent = ClassLoader.getSystemClassLoader().getParent();
System.out.println(parent);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
5、双亲委派机制
为什么要往上委托?
假如要加载String类,而我module中也有java.lang.String这个包的话,会容易出现误会。当然此处仍然加载的是Java核心API里面的java.lang.String
沙箱安全机制:
6、其他