Java 获取当前或调用者类名和方法名(Thread.currentThread().getStackTrace()、new Throwable().getStackTrace()) this.getClass().getName();

发布时间 2023-04-03 19:54:50作者: sunny123456

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