Java:获取当前正在执行的方法对应对象

2022-09-03 13:34:37

将当前正在执行的方法作为方法对象获取的最优雅方法是什么?

我的第一个明显方法是在帮助器类中使用静态方法,该方法将加载当前线程堆栈,获取正确的堆栈跟踪元素,然后根据其信息构造 Method 元素。

有没有更优雅的方法来实现这一点?


答案 1

这个主题在这个SO问题中有更深入的介绍。

我需要做同样的事情,我发现最好的解决方案是@alexsmail提供的解决方案。

这似乎有点黑客,但一般的想法是你在方法中声明一个本地类,然后利用class.getEnclosingMethod();

代码略有修改,@alexsmail的解决方案:

public class SomeClass {
   public void foo(){
      class Local {};
      Method m = Local.class.getEnclosingMethod();
   }
 }

答案 2

开箱即用,我不知道有更好的方法来做到这一点。

需要考虑的一件事可能是方面 - 您可以将一个方面编织到代码中,该代码围绕所有方法调用触发并将当前对象推送到ThreadLocal(基于从连接点获得的反射信息)。Method

如果它真的在所有方法上都触发了,这可能会非常昂贵,但是根据你对结果执行的操作,你可能能够将捕获限制在某些包/类上,这将有所帮助。您可以推迟对 too 的实际查找,直到使用它,而是存储方法的名称和参数等。Method

不过,我怀疑是否会有一种特别便宜的方法来实现这一目标。