查看Java的栈帧(stack frame)信息:类加载器名称、类名、文件名、行号、方法名、模块名等

介绍

可以通过Java的Throwable类来获取栈帧(stack frame)的信息。
Throwable类的getStackTrace()函数,返回了StackTraceElement[],其中每个StackTraceElement代表了一个栈帧。返回数组中的首个元素(数组元素的索引为0)表示栈顶,代表最后的函数调用,通常来说,这个就是Throwable被抛出的地方。数组元素的最后一个元素表示栈底,代表第一个函数调用的地方。
https://docs.oracle.com/en/java/javase/19/docs/api/java.base/java/lang/Throwable.html#getStackTrace()
查看Java的栈帧(stack frame)信息:类加载器名称、类名、文件名、行号、方法名、模块名等_第1张图片
Throwable类的printStackTrace()可以打印栈帧信息。
https://docs.oracle.com/en/java/javase/19/docs/api/java.base/java/lang/Throwable.html#printStackTrace()
查看Java的栈帧(stack frame)信息:类加载器名称、类名、文件名、行号、方法名、模块名等_第2张图片

示例

打印栈帧

package com.thb;

public class Test1 {
		
	public static void main(String[] args) {
		Test1 test = new Test1();
		test.m();		
	}
	
	public void m() {		
		this.m2();		
	}
	
	public void m2() {
		Throwable throwable = new Throwable();
		throwable.printStackTrace();
	}
}

输出:
查看Java的栈帧(stack frame)信息:类加载器名称、类名、文件名、行号、方法名、模块名等_第3张图片

查看各栈帧信息:类加载器名称、类名、文件名、行号、方法名、模块名等

// 定义主类
package com.thb;

public class Test1 {
		
	public static void main(String[] args) {
		Test1 test = new Test1();
		test.mInTest1();		
	}
	
	public void mInTest1() {		
		Another another = new Another();
		another.mInAnother();
	}
}


// 定义另一个类
package com.thb;

public class Another {

	public void mInAnother() {
		Throwable throwable = new Throwable();
		StackTraceElement[] stes = throwable.getStackTrace();		
		for (int i = 0; i < stes.length; i++) {
			System.out.println("第" + i + "栈帧");
			// 类加载器名称
			System.out.println("加载器名称: " + stes[i].getClassLoaderName());
			// 类名
			System.out.println("类名: " + stes[i].getClassName());
			// 文件名
			System.out.println("文件名: " + stes[i].getFileName());
			// 行号
			System.out.println("行号: " + stes[i].getLineNumber());
			// 方法名
			System.out.println("方法名: " + stes[i].getMethodName());
			// 模块名
			System.out.println("模块名: " + stes[i].getModuleName());
			System.out.println("*********************************");
		}
	}
}

运行输出:
第0栈帧
加载器名称: app
类名: com.thb.Another
文件名: Another.java
行号: 6
方法名: mInAnother
模块名: null


第1栈帧
加载器名称: app
类名: com.thb.Test1
文件名: Test1.java
行号: 12
方法名: mInTest1
模块名: null


第2栈帧
加载器名称: app
类名: com.thb.Test1
文件名: Test1.java
行号: 7
方法名: main
模块名: null


你可能感兴趣的:(java,开发语言)