论坛首页 Java企业应用论坛

方法内 如何得到当前方法名

浏览 10885 次
精华帖 (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

   发表时间:2010-12-04  
怎么获取行号的呢?
0 请登录后投票
   发表时间:2010-12-05  
public static final String where();  
{  
  StackTraceElement[] elems = new Exception().getStackTrace();  
}
貌似这已经是更好的方式了
0 请登录后投票
   发表时间:2010-12-05  
javaEye的内部搜索智能关联 ,真是做的越来越好了,1楼的你的问题,看下这个,
http://www.iteye.com/topic/67423
0 请登录后投票
   发表时间:2010-12-05  
可以去看看log4j的代码
0 请登录后投票
   发表时间:2010-12-06  
Thread.currentThread().getStackTrace()
返回一个表示该线程堆栈转储的堆栈跟踪元素数组。

何必再new一个excepetion 重新拷贝staceTrace ?
1 请登录后投票
   发表时间: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以上的应该都一样吧



0 请登录后投票
   发表时间:2010-12-06  
原来异常还能这么用!!!!受教了
 System.out.println(new Exception().getStackTrace()[0]);
//output:yfTest.shixi.tt.doit(tt.java:55)
0 请登录后投票
   发表时间:2010-12-07   最后修改:2010-12-07
这种方式在AOP调用下会产生一些问题,比如用了Spring,AOP的方式调用该方法,
new Exception().getStackTrace()[0].getMethodName()取出来的不是该方法名,好像要去到Stack的12层,
即new Exception().getStackTrace()[12].getMethodName()

由于没有环境,以上全凭记忆,没有测试...
0 请登录后投票
   发表时间: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什么的,知识更复杂了很多
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics