Java的方法能否“知道”自己的名称?

3

可能是重复问题:
获取当前执行方法的名称

在Java中,是否有一种方法可以让给定的方法知道自己的名称?如果有,如何从方法内部引用它?


你需要这样做是有特定的原因还是只是出于好奇? - arshajii
我想将函数名称传递给Timer类,该类可以智能地报告给定方法所花费的时间,而无需硬编码。 - James Raitsev
1
请查看:https://dev59.com/D3RB5IYBdhLWcg3w-8Po - Anthony Accioly
@Jam,不确定你是否以正确的方式计时特定的方法,因为如果你已经在其中,那么计时将会很困难。 - Bruno
我正在寻找一个估计,但是是的,我明白你的意思。 - James Raitsev
2个回答

5
您可以通过分析堆栈跟踪来确定它。但这可能会带来相当大的性能损失。在AOP领域,您还可以有一个方面来确定方法名称并将其存储在某种上下文中。
在堆栈跟踪方法中,您可以执行以下操作:
Exception e = new Exception();
e.fillInStackTrace();
e.getStackTrace()[0].getMethodName();

或者(如评论中建议的)
Thread.currentThread().getStackTrace()[0].getMethodName();

2
你不需要创建一个新的异常。Thread可以使用getStackTrace()返回堆栈跟踪。 - Steve Kuo
1
实际上,Thread.currentThread().getStackTrace()[0].getMethodName(); 将返回 "getStackTrace"。 getStackTrace()[1] 可能是您想要的 - 调用 getStackTrace() 的例程的名称。 在我的情况下,我想知道调用当前例程的例程的名称,因此 [2] 是我的答案。 - rcprcp
@rcprcp 以上代码必须放置在想要知道其名称的方法中。如果您在其上方放置更多实用程序方法,则始终需要调整堆栈跟踪。当我需要像这样做某事时,我只需传递一个参数来告诉它所需的调整量即可。 - Alex Gitelman
@AlexGitelman--(1)我该如何“调整堆栈跟踪”?(2)你所说的“在其上添加更多实用方法”是什么意思?(3)哪种参数及其值可以告诉我们“调整的数量”? - DSlomer64
@DSlomer64 如果你的方法是 foobar() 并且你将上述代码放在其中,那么你需要取偏移量为0的堆栈元素来获取 foobar。但如果你创建一个实用方法 getMethodName() 并从 foobar() 中调用它,那么偏移量将为1,因为在偏移量0处你会找到 getMethodName。 如果你有更多嵌套的方法,你将不得不进行更多的调整。 - Alex Gitelman

4

栈跟踪的第一个元素 (Thread.currentThread().getStackTrace(), 参见 这个问题) 应该在运行时告诉你当前所处的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接