在Java中查找调用Method

时间:2012-03-26 22:06:41

标签: java reflection

简短版本: 我需要在Java中找到一种方法来定位调用堆栈中的前一个Method(注意方法中的大写'M' - 我需要实际的java.lang.reflect.Method对象。)

背景: 我正在研究Google Guava Preconditions.checkNotNull(...)概念的扩展,它允许程序员同时检查所有参数是否为null,并根据调用方法的参数名称构造NPE。例如:

public class MyClass
{
    public void myMethod(Object arg1, Integer arg2, String arg3)
    {
        MyPreconditions.checkAllNotNull(arg1, arg2, arg3);
    }
}

因此,如果第一个参数为null,那么NPE可能会读取arg1 cannot be null (MyClass:myMethod(Object, Integer, String)

我已经研究过如何获取调用Class,我可以通过Spring LocalVariableTableParameterNameDiscoverer(或通过Paranamer库)获取参数名称Method 。我无法弄清楚的唯一部分是如何获得Method本身。

我知道您可以使用堆栈跟踪来获取方法 name ,但如果重写该方法,则无效。有没有办法(即使是内部的com.sun类)来获得实际的堆栈?或者,我可以获取调用方法的行号,那么有没有办法找到从Method对象中检索到的Class的行号?

2 个答案:

答案 0 :(得分:3)

Thread.getStackTrace()为您提供当前的堆栈跟踪。从那里你可以得到类名和方法名(即使方法被覆盖,你会在那里看到确切的类),并通过反射获得方法。

但是imo - 这很奇怪而且不需要。关于它的事情 - 如果Preconditions调用失败,你提供的信息大部分已经存在于堆栈跟踪中。

答案 1 :(得分:1)

“我知道您可以使用堆栈跟踪来获取方法名称,但如果重写该方法,则无效。” - 堆栈跟踪也包含类名(和源文件),但是,即使方法已被覆盖,也是正确的。

我认为没有任何(良好,一致)方式来获取实际的Method对象。尤其不适用于主动安全管理器。 Java安全代码本身使用了一些技巧来做到这一点,但复制那些在各种VM之间无法移植的技巧。