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

glm*_*ndr 12 java reflection

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

我的第一个明显的方法是在helper类中使用静态方法,它将加载当前线程堆栈,获取正确的堆栈跟踪元素,并从其信息构造Method元素.

是否有更优雅的方式来实现这一目标?

NSj*_*nas 16

本SO问题深入讨论了该主题.

我需要做同样的事情,我找到了最好的解决方案,成为@alexsmail提供的解决方案.

看起来有点hacky,但一般的想法是你在方法中声明一个本地类,然后利用 class.getEnclosingMethod();

从@ alexsmail的解决方案略微修改的代码:

public class SomeClass {
   public void foo(){
      class Local {};
      Method m = Local.class.getEnclosingMethod();
   }
 }
Run Code Online (Sandbox Code Playgroud)

  • 另一个简化版本可能是这样的:new Object(){}.getClass().getEnclosingMethod() (7认同)

And*_*yle 2

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

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

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

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