2012-06-08 24 views

回答

4

Stack introspection会给你方法的调用者或者最好的方法的一些细节,对于确切的方法签名你将不得不使用反射。

StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); 

官方文件说:

返回表示该线程堆栈转储 堆栈跟踪元件的阵列。如果此线程尚未启动或终止,此方法将返回一个零长度数组。如果返回的数组长度为非零长度 ,则数组的第一个元素表示堆栈的顶部 ,这是 序列中最新的方法调用。数组的最后一个元素表示 堆栈的底部,这是序列中最近最少的方法调用。

这样从StackTrace你可以得到方法名称,文件名,linenumber。

有关完整的方法签名,你将不得不使用反射

+0

是反射是在寻找签名确实是有用的,但我的要求是,我必须找到调用堆栈内省获得方法的签名,我没有源代码,我怎么会知道一些重载哪种方法(比如方法)被调用使用调用堆栈和反射而不使用源代码我确实有字节代码? –

+0

我不认为你可以,afaik只有方法名称和(如果可用调试-g)行号出现在堆栈跟踪中。如果它的一次性解决方案尝试反编译类和检查行号 – JIV

2

您可以使用Java ReflectionStackTraceElement

StackTraceElement[] elements = new Throwable().getStackTrace(); 

    String calleeMethod = elements[0].getMethodName(); 
    String callerMethodName = elements[1].getMethodName(); 
    String callerClassName = elements[1].getClassName(); 

    System.out.println("CallerClassName=" + callerClassName + " , Caller method name: " + callerMethodName); 
    System.out.println("Callee method name: " + calleeMethod); 
+2

我认为你的文章是没有任何帮助我的问题 –