将当前正在执行的方法作为Method对象的最优雅方法是什么?
我的第一个显而易见的方法是在helper类中使用静态方法,它将加载当前线程堆栈,获取正确的堆栈跟踪元素,并根据其信息构造Method元素。
是否有更优雅的方式来实现这一目标?
将当前正在执行的方法作为Method对象的最优雅方法是什么?
我的第一个显而易见的方法是在helper类中使用静态方法,它将加载当前线程堆栈,获取正确的堆栈跟踪元素,并根据其信息构造Method元素。
是否有更优雅的方式来实现这一目标?
开箱即用,我不知道有更好的方法来做到这一点。
要考虑的一件事可能是方面 - 您可以将一个方面编织到围绕所有方法调用的代码中并推送当前 Method
对象到ThreadLocal(基于可从连接点获得的反射信息)。
如果真的开火,这可能会非常昂贵 所有 方法,但取决于你对结果做了什么,你可能能够将捕获限制到某些包/类,这将有所帮助。您可以推迟实际的查找 Method
直到它被使用的时间为止,而是存储方法和参数的名称等。
不过,我怀疑是否会以一种特别便宜的方式实现这一目标。
更深入地介绍了该主题 在这个SO问题中。
我需要做同样的事情,我找到了最好的解决方案,成为@alexsmail提供的解决方案。
它似乎有点hacky但总的想法是你在方法中声明一个本地类,然后利用 class.getEnclosingMethod();
从@ alexsmail的解决方案略微修改的代码:
public class SomeClass {
public void foo(){
class Local {};
Method m = Local.class.getEnclosingMethod();
}
}