锁定老帖子 主题:方法内 如何得到当前方法名
精华帖 (0) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-12-04
做单元 测试时,输出日志想知道当前 在执行哪个方法,直接用reflect没想到怎么写,在网上搜索了一下,可以这样写, 分享下,看看大家 还有没有 相关别的好方法。
JDK1.4 public class MyTest { public static void main(String args[]) { new MyTest().doit(); } public void doit() { System.out.println (new Exception().getStackTrace()[0].getMethodName()); } }
JDK1.5, a new technique is available. public class Test { public static void main(String args[]) { trace(Thread.currentThread().getStackTrace()); new Test().doit(); trace(Thread.currentThread().getStackTrace()); } public void doit() { trace(Thread.currentThread().getStackTrace()); doitagain(); } public void doitagain() { trace(Thread.currentThread().getStackTrace()); } public static void trace(StackTraceElement e[]) { boolean doNext = false; for (StackTraceElement s : e) { if (doNext) { System.out.println(s.getMethodName()); return; } doNext = s.getMethodName().equals("getStackTrace"); } } }
main doit doitagain main 参考: http://www.rgagnon.com/javadetails/java-0420.html 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-12-04
怎么获取行号的呢?
|
|
返回顶楼 | |
发表时间:2010-12-05
public static final String where();
{ StackTraceElement[] elems = new Exception().getStackTrace(); } 貌似这已经是更好的方式了 |
|
返回顶楼 | |
发表时间:2010-12-05
javaEye的内部搜索智能关联 ,真是做的越来越好了,1楼的你的问题,看下这个,
http://www.iteye.com/topic/67423 |
|
返回顶楼 | |
发表时间:2010-12-05
可以去看看log4j的代码
|
|
返回顶楼 | |
发表时间:2010-12-06
Thread.currentThread().getStackTrace()
返回一个表示该线程堆栈转储的堆栈跟踪元素数组。 何必再new一个excepetion 重新拷贝staceTrace ? |
|
返回顶楼 | |
发表时间:2010-12-06
qianhd 写道 Thread.currentThread().getStackTrace()
返回一个表示该线程堆栈转储的堆栈跟踪元素数组。 何必再new一个excepetion 重新拷贝staceTrace ? +1 JDK上API: public final class StackTraceElementextends Objectimplements Serializable 堆栈跟踪中的元素,它由 Throwable.getStackTrace() 返回。每个元素表示单独的一个堆栈帧。所有的堆栈帧(堆栈顶部的那个堆栈帧除外)都表示一个方法调用。堆栈顶部的帧表示生成堆栈跟踪的执行点。通常,这是创建对应于堆栈跟踪的 throwable 的点。 从以下版本开始: 1.4 所以1.4以上的应该都一样吧 |
|
返回顶楼 | |
发表时间:2010-12-06
原来异常还能这么用!!!!受教了
System.out.println(new Exception().getStackTrace()[0]); //output:yfTest.shixi.tt.doit(tt.java:55) |
|
返回顶楼 | |
发表时间:2010-12-07
最后修改:2010-12-07
这种方式在AOP调用下会产生一些问题,比如用了Spring,AOP的方式调用该方法,
new Exception().getStackTrace()[0].getMethodName()取出来的不是该方法名,好像要去到Stack的12层, 即new Exception().getStackTrace()[12].getMethodName() 由于没有环境,以上全凭记忆,没有测试... |
|
返回顶楼 | |
发表时间:2010-12-07
mtnt2008 写道 qianhd 写道 Thread.currentThread().getStackTrace()
返回一个表示该线程堆栈转储的堆栈跟踪元素数组。 何必再new一个excepetion 重新拷贝staceTrace ? +1 JDK上API: public final class StackTraceElementextends Objectimplements Serializable 堆栈跟踪中的元素,它由 Throwable.getStackTrace() 返回。每个元素表示单独的一个堆栈帧。所有的堆栈帧(堆栈顶部的那个堆栈帧除外)都表示一个方法调用。堆栈顶部的帧表示生成堆栈跟踪的执行点。通常,这是创建对应于堆栈跟踪的 throwable 的点。 从以下版本开始: 1.4 所以1.4以上的应该都一样吧 +1 行号也是能这样拿到的,前阵研究通过javassist修改字节码还能拿到方法的参数和返回值。 好多做trace的软件用类似的思路,btrace什么的,知识更复杂了很多 |
|
返回顶楼 | |