sunny123456

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  1796 随笔 :: 22 文章 :: 24 评论 :: 226万 阅读
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

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

posted on   sunny123456  阅读(795)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示