Java 堆栈信息对象 StackTraceElement,获取当前线程的执行方法

java.langStackTraceElement类保存了Java中线程中的方法栈信息:

4个属性:

/**
* 声明的类,是类的全限定名
*/
private String declaringClass;
/**
* 方法名
*/
private String methodName;
/**
* 文件名一般指:XXX.java
*/
private String fileName;
/**
* XX.java类中的行数
*/
private int    lineNumber;

一个简单的在SpringBoot 2.0.5-RELEASE 下的示例:

for ( StackTraceElement ele : Thread.currentThread().getStackTrace()) {
    System.out.println("线程栈信息输出:" + ele.getClassName() + "$" + ele.getMethodName() + "$" + ele.getFileName() + "$" + ele.getLineNumber());
}

输出结果如下:

线程栈信息输出:java.lang.Thread$getStackTrace$Thread.java$1559
线程栈信息输出:com.example.myboot.businessTests.RabbitMQTest$test2$RabbitMQTest.java$54
线程栈信息输出:sun.reflect.NativeMethodAccessorImpl$invoke0$NativeMethodAccessorImpl.java$-2
线程栈信息输出:sun.reflect.NativeMethodAccessorImpl$invoke$NativeMethodAccessorImpl.java$62
线程栈信息输出:sun.reflect.DelegatingMethodAccessorImpl$invoke$DelegatingMethodAccessorImpl.java$43
线程栈信息输出:java.lang.reflect.Method$invoke$Method.java$498
线程栈信息输出:org.junit.runners.model.FrameworkMethod$1$runReflectiveCall$FrameworkMethod.java$50
线程栈信息输出:org.junit.internal.runners.model.ReflectiveCallable$run$ReflectiveCallable.java$12
线程栈信息输出:org.junit.runners.model.FrameworkMethod$invokeExplosively$FrameworkMethod.java$47
线程栈信息输出:org.junit.internal.runners.statements.InvokeMethod$evaluate$InvokeMethod.java$17
线程栈信息输出:org.springframework.test.context.junit4.statements.RunBeforeTestExecutionCallbacks$evaluate$RunBeforeTestExecutionCallbacks.java$73
线程栈信息输出:org.springframework.test.context.junit4.statements.RunAfterTestExecutionCallbacks$evaluate$RunAfterTestExecutionCallbacks.java$83
线程栈信息输出:org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks$evaluate$RunBeforeTestMethodCallbacks.java$75
线程栈信息输出:org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks$evaluate$RunAfterTestMethodCallbacks.java$86
线程栈信息输出:org.springframework.test.context.junit4.statements.SpringRepeat$evaluate$SpringRepeat.java$84
线程栈信息输出:org.junit.runners.ParentRunner$runLeaf$ParentRunner.java$325
线程栈信息输出:org.springframework.test.context.junit4.SpringJUnit4ClassRunner$runChild$SpringJUnit4ClassRunner.java$251
线程栈信息输出:org.springframework.test.context.junit4.SpringJUnit4ClassRunner$runChild$SpringJUnit4ClassRunner.java$97
线程栈信息输出:org.junit.runners.ParentRunner$3$run$ParentRunner.java$290
线程栈信息输出:org.junit.runners.ParentRunner$1$schedule$ParentRunner.java$71
线程栈信息输出:org.junit.runners.ParentRunner$runChildren$ParentRunner.java$288
线程栈信息输出:org.junit.runners.ParentRunner$access$000$ParentRunner.java$58
线程栈信息输出:org.junit.runners.ParentRunner$2$evaluate$ParentRunner.java$268
线程栈信息输出:org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks$evaluate$RunBeforeTestClassCallbacks.java$61
线程栈信息输出:org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks$evaluate$RunAfterTestClassCallbacks.java$70
线程栈信息输出:org.junit.runners.ParentRunner$run$ParentRunner.java$363
线程栈信息输出:org.springframework.test.context.junit4.SpringJUnit4ClassRunner$run$SpringJUnit4ClassRunner.java$190
线程栈信息输出:org.junit.runner.JUnitCore$run$JUnitCore.java$137
线程栈信息输出:com.intellij.junit4.JUnit4IdeaTestRunner$startRunnerWithArgs$JUnit4IdeaTestRunner.java$68
线程栈信息输出:com.intellij.rt.execution.junit.IdeaTestRunner$Repeater$startRunnerWithArgs$IdeaTestRunner.java$47
线程栈信息输出:com.intellij.rt.execution.junit.JUnitStarter$prepareStreamsAndStart$JUnitStarter.java$242
线程栈信息输出:com.intellij.rt.execution.junit.JUnitStarter$main$JUnitStarter.java$70

从结果中我们可以看出, 栈顶是Thread的getStackTrace方法,这个很好理解。Thread.currentThread().getStackTrace()[1] 是当前执行查看堆栈信息的方法RabbitMQTest的test2。
栈底是 JUnitStarter的main 方法,然后我们看到实际调用了 org.springframework.test.context.junit4.SpringJUnit4ClassRunner的run 方法。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值