ClassLoader使用介绍
- 2026-02-27 22:22:00
- admin
- 原创 63
一、ClassLoader使用介绍
1、BootstrapClassLoader,用于加载核心类库,类库位于%JRE_HOME%\lib,环境变量是sun.boot.class.path
2、ExtClassLoader,用于加载扩展类库,类库位于%JRE_HOME%\lib\ext,环境变量是java.ext.dirs
3、AppClassLoader,用于加载应用类,环境变量是java.class.path
4、LaunchedURLClassLoader,用于加载springboot的应用类
5、类加载器继承:ExtClassLoader -> URLClassLoader -> SecureClassLoader -> ClassLoader
6、类加载器继承:AppClassLoader -> URLClassLoader -> SecureClassLoader -> ClassLoader
父加载器:
1、ClassLoader包含一个成员parent,每个类加载器包含一个父加载器;
2、ExtClassLoader的父加载器为空;
3、AppClassLoader的父加载器是ExtClassLoader;
4、自定义类加载器的父加载器默认是AppClassLoader;
类加载机制:
1、loadClass:调用this.findLoadedClass,调用parent.loadClass,调用this.findClass()
2、类查找方向:AppClassLoader -> ExtClassLoader -> BootstrapClassLoader
3、类加载方向:BootstrapClassLoader -> ExtClassLoader -> AppClassLoader
工具函数:
1、ClassLoader.getSystemClassLoader(),获取虚拟机的类加载器,默认是AppClassLoader;
2、Thread.currentThread().getContextClassLoader(),获取线程的类加载器,默认是AppClassLoader;
3、ClassLoader.loadClass(className),使用类加载器加载类,不进行静态初始化;
4、Class.forName(className),使用虚拟机的类加载器加载类,进行静态初始化;
获取调用类:哪个类调用了getCallerClass
StackWalker.Option option = StackWalker.Option.RETAIN_CLASS_REFERENCE;
StackWalker walker = StackWalker.getInstance(option);
Class cls = walker.getCallerClass();