Java 获取当前或调用者类名和方法名(Thread.currentThread().getStackTrace()、new Throwable().getStackTrace())
原文链接:https://blog.csdn.net/inthat/article/details/111885544
文章目录
一、Java获取当前类名和方法名Thread.currentThread().getStackTrace()
获取class名:
this.getClass().getName();
或者
Thread.currentThread().getStackTrace()[1].getClassName();
获取方法名:
Thread.currentThread().getStackTrace()[1].getMethodName();
获取行号:
Thread.currentThread().getStackTrace()[1].getLineNumber();
获取文件名(带后缀):
Thread.currentThread().getStackTrace()[1].getFileName();
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
getStackTrace()返回一个表示该线程堆栈转储的堆栈跟踪元素数组。如果该线程尚未启动或已经终止,则该方法将返回一个零长度数组。如果返回的数组不是零长度的,则其第一个元素代表堆栈顶,它是该序列中最新的方法调用。最后一个元素代表堆栈底,是该序列中最旧的方法调用。getStackTrace()[0]表示的是getStackTrace方法。
线程是以栈形式存放的 。
1. 关于Thread.currentThread().getStackTrace()
得到当前堆栈信息的两种方式(Thread和Throwable)的方法
参考URL: https://blog.csdn.net/luulmm520/article/details/53231568
getStackTrace()返回一个表示该线程堆栈转储的堆栈跟踪元素数组。如果该线程尚未启动或已经终止,则该方法将返回一个零长度数组。如果返回的数组不是零长度的,则其第一个元素代表堆栈顶,它是该序列中最新的方法调用。最后一个元素代表堆栈底,是该序列中最旧的方法调用。getStackTrace()[0]表示的事getStackTrace方法
2. Thread.currentThread().getStackTrace()这种直接获取堆栈的方法在中有何隐患吗?
应该没有问题,但是对整个应用程序性能有影响
https://stackoverflow.com/questions/2347828/how-expensive-is-thread-getstacktrace
Thread.currentThread()已经产生了一些开销,如果我正确理解@David,则.getStackTrace()的开销比Throwable上的相同方法“高得多”,因为Thread对象本身必须在获取堆栈时保持线程安全性 用于关联线程,而在新Throwable()上的堆栈跟踪中填充的Throwable已经知道它是针对调用线程的。
new Throwable().getStackTrace()
总结:根据网上说法 new Throwable().getStackTrace() 比 Thread.currentThread().getStackTrace() 性能好些。
二、【推荐】Java获取当前类名和方法名new Throwable().getStackTrace()
String classname = new Exception().getStackTrace()[1].getClassName(); //获取调用者的类名
String method_name = new Exception().getStackTrace()[1].getMethodName(); //获取调用者的方法名
- 1
- 2
- 3
或
String classname = new Throwable().getStackTrace()[1].getClassName(); //获取调用者的类名
String method_name = new Throwable().getStackTrace()[1].getMethodName(); //获取调用者的方法名
- 1
- 2
- 3
- 4
1. 关于Java Throwable getStackTrace()方法
java.lang.Throwable.getStackTrace() 方法返回堆栈跟踪元素的数组,每个代表一个堆栈帧。
getStackTrace()返回一个表示该线程堆栈转储的堆栈跟踪元素数组。如果该线程尚未启动或已经终止,则该方法将返回一个零长度数组。如果返回的数组不是零长度的,则其第一个元素代表堆栈顶,它是该序列中最新的方法调用。最后一个元素代表堆栈底,是该序列中最旧的方法调用。getStackTrace()[0]表示的事getStackTrace方法
三、参考
模拟log4j获取日志对象调用所在的类名、方法名及行号
参考URL: https://blog.csdn.net/z69183787/article/details/77680131