ClassLoader使用介绍

2026-02-27 22:22:00
admin
原创 63
摘要:ClassLoader使用介绍

一、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();

发表评论
评论通过审核之后才会显示。