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

一、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();

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(); //获取调用者的方法名 


String classname = new Throwable().getStackTrace()[1].getClassName(); //获取调用者的类名  
  
String method_name = new Throwable().getStackTrace()[1].getMethodName(); //获取调用者的方法名 

1. 关于Java Throwable getStackTrace()方法

java.lang.Throwable.getStackTrace() 方法返回堆栈跟踪元素的数组,每个代表一个堆栈帧。

getStackTrace()返回一个表示该线程堆栈转储的堆栈跟踪元素数组。如果该线程尚未启动或已经终止,则该方法将返回一个零长度数组。如果返回的数组不是零长度的,则其第一个元素代表堆栈顶,它是该序列中最新的方法调用。最后一个元素代表堆栈底,是该序列中最旧的方法调用。getStackTrace()[0]表示的事getStackTrace方法

三、参考

模拟log4j获取日志对象调用所在的类名、方法名及行号
参考URL: https://blog.csdn.net/z69183787/article/details/77680131

  • 7
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Java中,可以使用StackTraceElement类来获取当前方法的行号、方法类名和文件,以及调用该方法方法的信息。下面是示例代码: ``` StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace(); if (stackTraceElements.length >= 2) { // 获取当前方法信息 StackTraceElement currentMethod = stackTraceElements[1]; String className = currentMethod.getClassName(); String methodName = currentMethod.getMethodName(); String fileName = currentMethod.getFileName(); int lineNumber = currentMethod.getLineNumber(); System.out.println("当前方法信息:"); System.out.println("类名:" + className); System.out.println("方法:" + methodName); System.out.println("文件:" + fileName); System.out.println("行号:" + lineNumber); // 获取调用该方法方法信息 StackTraceElement callerMethod = stackTraceElements[2]; String callerClassName = callerMethod.getClassName(); String callerMethodName = callerMethod.getMethodName(); String callerFileName = callerMethod.getFileName(); int callerLineNumber = callerMethod.getLineNumber(); System.out.println("调用该方法方法信息:"); System.out.println("类名:" + callerClassName); System.out.println("方法:" + callerMethodName); System.out.println("文件:" + callerFileName); System.out.println("行号:" + callerLineNumber); } ``` 需要注意的是,获取方法信息的代码必须位于该方法内部。如果将该代码放在其他方法中,则获取到的信息可能是其他方法的信息。另外,由于获取方法信息的代码本身也会被添加到堆栈跟踪中,因此需要使用`stackTraceElements[2]`来获取调用该方法方法的信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西京刀客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值