一个简单的在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 方法。
有些时候或者为了调试程序或者为了打印信息,我们需要在程序运行期间获取程序调度堆栈的信息,java在运行期间可以通过throwable类来获取方法调用堆栈信息。
例如哪个方法调用的当前方法,当前运行类的类名,文件名,代码行等等。
public void test() {
Throwable ex = new Throwable();
StackTrace...
本文的出发点在于处理现场问题时,想看到方法的调用过程
StackTrace(堆栈轨迹)存放的就是方法调用栈的信息,每次调用一个方法会产生一个方法栈,当前方法调用另外一个方法时会使用栈将当前方法的现场信息保存在此方法栈当中,获取这个栈就可以得到方法调用的详细过程。
StackTraceElement stack[] = Thread.currentThread().getStackTrace();
java中提供了Thread.currentThread().getStackTrace()和new Throwable().getStackTrace()来获取堆栈信息,通过该方法返回堆栈数组。其数组第一个元素为Thread执行元素,索执行的方法为getStackTrace。其后依次是嵌套包裹执行的最里层,依次向外。
下面通过实例说明: public static void display()
形参:方法被调用时需要传递进来的参数,如:func(int a)中的a,它只有在func被调用期间a才有意义,也就是会被分配内存空间,在方法func执行完成后,a就会被销毁释放空间,也就是不存在了
实参:方法被调用时是传入的实际值,它在方法被调用前就已经被初始化并且在方法被调用时传入。
public static void func(int a){
a=20;
System.out.println(a);
public static void mai
StackTrace用栈的形式保存了方法的调用信息。
可用Thread.currentThread().getStackTrace()方法得到当前线程的StackTrace信息,该方法返回的是一个StackTraceElement数组。
线程中methodA调用了methodB,那么methodA先入栈methodB再入栈。
在StackTraceElement数组下标为2的元素中保存了当前方法的所
返回表示此线程的堆栈转储的堆栈跟踪元素数组。 如果此线程尚未启动,已启动但尚未安排由系统运行或已终止,则此方法将返回零长度数组。 如果返回的数组长度为非零,则数组的第一个元素表示堆栈的顶部,这是序列中最近的方法调用。 数组的最后一个元素表示堆栈的底部,这是序列中最近的方法调用。
如果有一个安全管理器,并且该线程不是当前线程,则调用安全管理器的checkPermission方法,并获得RuntimeP
简单来说就是 Tthread类(线程类) 中的一个方法 Thread.currentThread() 是指获取当前运行的线程对象 例如: Thread.currentThread().getName() 就是获取当前运行的线程的名称
今天看到有一个工具类中有一句:
[code="java"]String msgToPrint = Thread.currentThread().getStackTrace()[3]
.getMethodName();[/cod...
一、什么是StackTrace
StackTrace(堆栈轨迹)存放的就是方法调用栈的信息,每次调用一个方法会产生一个方法栈,当前方法调用另外一个方法时会使用栈将当前方法的现场信息保存在此方法栈当中,获取这个栈就可以得到方法调用的详细过程。例如:异常处理中常用的e.printStackTrace()实质就是打印异常调用的堆栈信息。
二、StackTraceElement介绍
1.获取当前方法堆栈,我们一般用
StackTraceElement[] stes = Thread.currentThread().getStackTrace();
想要获取当前方法,切记不够灵活,使用数组stes的固定index(网上不少是这样说的,请明辨之)。
让我们来看api怎么说的吧?
getStackTrace
public StackTraceElement[]...
* 1 StackTrace用栈的形式保存了方法的调用信息.
* 2 怎么获取这些调用信息呢?
* 可用Thread.currentThread().getStack
1. public void testGetStackTraceFunctionsName() {
2. //第0个方法名
3. String methodName0=Thread.currentThread().getStackTrace()[0].getMethodName();
4. System.out.println(met
StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
for (StackTraceElement e : stackTrace) {
System.out.println(e.getClassName() + "\t"