ClassLoader使用介绍 获取调用堆栈 打印异常栈

2026-02-27 22:22:00
admin
原创 113
摘要: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();


二、获取调用堆栈

推荐方法:

List<StackWalker.StackFrame> stackFrames = stackWalker.walk(
    frames -> frames.collect(Collectors.toList()));


其他方法:

1、Thread.currentThread().getStackTrace(),返回StackTraceElement[]
2、new Throwable().getStackTrace(),返回StackTraceElement[]
3、Thread.dumpStack(),返回void


三、打印异常栈

public static void printStackTraces(StackTraceElement[] stacks) {
for (StackTraceElement stack : stacks) {
String info = String.format("%s:%s:%s",
stack.getClassName(), stack.getMethodName(), stack.getLineNumber());
System.out.println(info);
}
}

public static void getStackTraces() {
try {
throw new Exception("MyException");
} catch (Exception e) {
System.out.println(e.getMessage());
System.out.println(e.getCause());
StackTraceElement[] stacks = e.getStackTrace();
printStackTraces(stacks);
}
}


输出:

MyException
null
logdemo.LogDemo:getStackTraces:15
logdemo.LogDemo:main:25

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