Talking about getStackTrace() method

origin:

Today I saw a sentence in a tool class:

String msgToPrint = Thread.currentThread().getStackTrace()[``1``].getMethodName();

The output result is very simple, that is, the method name of the calling class.

Documentation:

public StackTraceElement[] getStackTrace()
  • return:

    StackTraceElementarray, each representing a stack frame.

The first method of the Thread class used in it:

public static Thread currentThread()

The second method: (read the documentation of Java SE:)

public StackTraceElement[] getStackTrace()

Returns an array of stack trace elements representing the stack status of this thread.

If: 1. This thread is not opened; 2. This thread is opened but has not been run by the system (because the thread operation needs to be rotated according to certain rules); 3. This thread is over.

In these three cases, the length of the array returned by getStackTrace() is 0.

If the length of the returned array is not 0, then the first element of the array represents the top element of the stack , which is the most recent method in this call sequence.

The last element of the array represents the bottom element of the stack , the element furthest in the call sequence.

Program Test - Java Program

The test class, the main method is as follows:

public static void main(String[] args) {
    
    
    StackTraceElement[] stackTraceElements=Thread.currentThread().getStackTrace();
    System.out.println("The stackTraceElements length:"+stackTraceElements.length);
    for(int i=0;i<stackTraceElements.length;i++){
    
    
        System.out.println("\n---the  "+i+"  element"+"---");
        System.out.println("toString:"+stackTraceElements[i].toString());
        System.out.println("ClassName:"+stackTraceElements[i].getClassName());
        System.out.println("FileName:"+stackTraceElements[i].getFileName());
        System.out.println("LineNumber:"+stackTraceElements[i].getLineNumber());
        System.out.println("MethodName:"+stackTraceElements[i].getMethodName());
    }
}

Output after execution:

The stackTraceElements length:2
 
---the  0  element---
toString:java.lang.Thread.getStackTrace(Thread.java:1567)
ClassName:java.lang.Thread
FileName:Thread.java
LineNumber:1567
MethodName:getStackTrace
 
---the  1  element---
toString:Exchange.main(Exchange.java:10)
ClassName:Exchange
FileName:Exchange.java
LineNumber:10
MethodName:main

If you use another private method, output the information of the call stack

public static void main(String[] args) {
    
    
    StackTraceElement[] stackTraceElements=Thread.currentThread().getStackTrace();
    System.out.println("The stackTraceElements length:"+stackTraceElements.length);
    for(int i=0;i<stackTraceElements.length;i++){
    
    
        System.out.println("\n---the  "+i+"  element"+"---");
        System.out.println("toString:"+stackTraceElements[i].toString());
        System.out.println("ClassName:"+stackTraceElements[i].getClassName());
        System.out.println("FileName:"+stackTraceElements[i].getFileName());
        System.out.println("LineNumber:"+stackTraceElements[i].getLineNumber());
        System.out.println("MethodName:"+stackTraceElements[i].getMethodName());
    }
    printStackInfos();
}
private static void printStackInfos(){
    
    
    StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
    System.out.println("\nCalled in printStackInfos() method!!!");
    System.out.println("The stackTraceElements length:"+stackTraceElements.length);
    for(int i =0;i<stackTraceElements.length;i++){
    
    
        System.out.println("\n---the  "+i+"  element"+"---");
        System.out.println("toString:"+stackTraceElements[i].toString());
        System.out.println("ClassName:"+stackTraceElements[i].getClassName());
        System.out.println("FileName:"+stackTraceElements[i].getFileName());
        System.out.println("LineNumber:"+stackTraceElements[i].getLineNumber());
        System.out.println("MethodName:"+stackTraceElements[i].getMethodName());
    }
     
}

Then the output is as follows:

The stackTraceElements length:``2` `---the ``0` `element---The stackTraceElements length:2
 
---the  0  element---
toString:java.lang.Thread.getStackTrace(Thread.java:1567)
ClassName:java.lang.Thread
FileName:Thread.java
LineNumber:1567
MethodName:getStackTrace
 
---the  1  element---
toString:Exchange.main(Exchange.java:10)
ClassName:Exchange
FileName:Exchange.java
LineNumber:10
MethodName:main
 
Called in printStackInfos() method!!!
The stackTraceElements length:3
 
---the  0  element---
toString:java.lang.Thread.getStackTrace(Thread.java:1567)
ClassName:java.lang.Thread
FileName:Thread.java
LineNumber:1567
MethodName:getStackTrace
 
---the  1  element---
toString:Exchange.printStackInfos(Exchange.java:24)
ClassName:Exchange
FileName:Exchange.java
LineNumber:24
MethodName:printStackInfos
 
---the  2  element---
toString:Exchange.main(Exchange.java:20)
ClassName:Exchange
FileName:Exchange.java
LineNumber:20
MethodName:main

It can be seen that after adding a private method, there is one more stack element returned, and its position is between the method calling it and the method called by it .

Guess you like

Origin blog.csdn.net/qq_43842093/article/details/131349120