`
enjoyj2ee
  • 浏览: 4893 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

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

    博客分类:
  • Java
阅读更多

做单元 测试时,输出日志想知道当前 在执行哪个方法,直接用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

分享到:
评论
13 楼 坏孩子 2010-12-07  
xiaguangme 写道
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什么的,知识更复杂了很多


行号不一定能拿到,jdk上写了,和编译器设置有关

12 楼 enjoyj2ee 2010-12-07  
经常遇到来面试的人,用SSH做了几年项目,就号称精通JAVA,。。。
现在 真是需要 沉下心来深入一门语言背后的底层。。。多阅读优秀软件的源码。。
像这个问题,天天用log4j,其实这就是他的基本功能。。。
11 楼 hbbbs 2010-12-07  
thinkaboutit 写道
这种需求本身就不合理,如果不是公用的,在每个当前方法都要打。
直接在程序里指定不就可以了。

比如doIt() {
    String methodName = "doIt";
}

如果要公用,那么,比如AOP,获取当前被拦截的方法的名字是多么简单的一件事。

真不知道是爱好学术研究还是咋的,喜欢搞这种事情。



感觉用处还是有的,比如手动抛出某些业务异常时或做一些重要log时,不想记录整个stack,那个就可以使用楼主的这种方法,进行一些精简的记录。
10 楼 thinkaboutit 2010-12-07  
这种需求本身就不合理,如果不是公用的,在每个当前方法都要打。
直接在程序里指定不就可以了。

比如doIt() {
    String methodName = "doIt";
}

如果要公用,那么,比如AOP,获取当前被拦截的方法的名字是多么简单的一件事。

真不知道是爱好学术研究还是咋的,喜欢搞这种事情。
9 楼 xiaguangme 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什么的,知识更复杂了很多
8 楼 hbbbs 2010-12-07  
这种方式在AOP调用下会产生一些问题,比如用了Spring,AOP的方式调用该方法,
new Exception().getStackTrace()[0].getMethodName()取出来的不是该方法名,好像要去到Stack的12层,
即new Exception().getStackTrace()[12].getMethodName()

由于没有环境,以上全凭记忆,没有测试...
7 楼 请输入用户名 2010-12-06  
原来异常还能这么用!!!!受教了
 System.out.println(new Exception().getStackTrace()[0]);
//output:yfTest.shixi.tt.doit(tt.java:55)
6 楼 mtnt2008 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以上的应该都一样吧



5 楼 qianhd 2010-12-06  
Thread.currentThread().getStackTrace()
返回一个表示该线程堆栈转储的堆栈跟踪元素数组。

何必再new一个excepetion 重新拷贝staceTrace ?
4 楼 ustcfrank 2010-12-05  
可以去看看log4j的代码
3 楼 enjoyj2ee 2010-12-05  
javaEye的内部搜索智能关联 ,真是做的越来越好了,1楼的你的问题,看下这个,
http://www.iteye.com/topic/67423
2 楼 C_J 2010-12-05  
public static final String where();  
{  
  StackTraceElement[] elems = new Exception().getStackTrace();  
}
貌似这已经是更好的方式了
1 楼 godtiger 2010-12-04  
怎么获取行号的呢?

相关推荐

    Windows VC++ 调整进程当前目录为程序可执行文件所在目录

    《Windows VC++ 调整进程当前目录为程序可执行文件所在目录》...得到当前进程可执行文件的路径名,文件名,后缀名。 3.AdjustProcessCurrentDirectory 调整进程当前目录为程序可执行文件所在目录

    5种方法得到所有进程名(包括隐藏进程)

    VB使用5种方法得到所有进程名(包括隐藏进程),2000系统下可能不能使用,判断系统版本如果是2K以下的系统就报错退出,获取Debug权限这是必须的。获取常规下的进程,打印进程、判断指定进程是否为隐藏进程……  ...

    linux c 获得当前进程的进程名和执行路径(示例)

    如何得到当前进程的进程名和执行路径。写了个程序分享一下

    Python获取当前函数名称方法实例分享

    主要介绍了Python获取当前函数名称方法实例分享,具有一定借鉴价值

    VC++获得当前进程运行目录的方法

    本文实例讲述了VC++获得当前进程运行目录的方法,分享给大家供大家参考。具体实现方法如下: 该实例主要通过利用windows API获得,具体代码如下:   代码如下:CString GetAppPath() {  CString strAppPath; // ...

    Android 通过process进程信息拿到当期正在运行的APP包名

    把下载下来的JAVA文件放入项目中,调用工具中的方法getLinuxCoreInfo(Context context, String packageName),便可得到当前位于栈顶的APP包名。

    网络营销工具与方法.pptx

    第一节 网络营销工具 1.1企业网站 1.1.1企业网站的概念和特点 五个要素 域 名 访问速 度快 网页设计有创意且目的 网页内容经常更新 操作简便界面友好 网络营销工具与方法全文共48页,当前为第2页。 第一节 网络营销...

    Android获得设备状态信息、Mac地址、IP地址的方法

    有些软件还要根据Mac地址来判定当前用户以前是否登录过。下面将一一介绍获取这些手机状态信息的方法。 1 通过build获取手机硬件信息 运用反射获取Build信息,然后从build中得到对应字段的值。这种情况适用于获取...

    Denoise Methods

    当前最成功的三种图像去噪方法Matlab运行程序比较,包括著名的BLS-GSM,Non local means以及BM3D(Block Matching 3D)方法。运行目录下的Denoising_Demo.m即可得到结果。当前最成功的三种图像去噪方法Matlab运行程序...

    python获取当前运行函数名称的方法实例代码

    摘要: c/c++中获取函数所在源码名,函数名和行号的方法很简单 __FILE__,__FUNCTION__和__LINE__ python没有这种语法,但也可以通过某种方法得到,这里给出例子,使用异常信息得到【可能会损失性能】 直接贴代码[可...

    Yii2使用$this-context获取当前的Module、Controller(控制器)、Action等

    使用Yii2的时候,在某些场景和环境下需要获得Yii2目前所处于的module(模型)、Controller(控制器)、Action(方法),以及会调用控制器里面已经定义过的一些公共的方法等.对于这些问题Yii2可以在视图层View中使用$this->...

    扩展智能电视的存储空间的方法.docx

    扩展智能电视的存储空间的方法全文共3页,当前为第1页。扩展智能电视的存储空间的方法全文共3页,当前为第1页。扩展智能电视的存储空间的方法 扩展智能电视的存储空间的方法全文共3页,当前为第1页。 扩展智能电视的...

    华为智能手机的使用方法说明文.docx

    华为智能手机的使用方法说明文全文共6页,当前为第1页。华为智能手机的使用方法说明文全文共6页,当前为第1页。华为智能手机的使用方法说明文 华为智能手机的使用方法说明文全文共6页,当前为第1页。 华为智能手机的...

    图像去噪方法分析比较(BLS GSM, BM3D, Nonlocal Means)

    当前最成功的三种图像去噪方法Matlab运行程序比较,包括著名的BLS-GSM,Non local means以及BM3D(Block Matching 3D)方法。运行目录下的Denoising_Demo.m即可得到结果。

    python在windows和linux下获得本机本地ip地址方法小结

    python的socket包含了丰富的函数和方法可以获得本机的ip地址信息,socket对象的gethostbyname方法可以根据主机名获得本机ip地址,socket对象的gethostbyname_ex方法可以获得本机所有ip地址列表 第一种方法:通过...

    华为智能手机的使用方法说明文(1).docx

    定制的系统必然有其特殊之处,下面给大家分享一下这些有趣又好用的功能吧: 1、黑屏状态下,按住下音量键,听到声音后说出通讯录里面的名华为智能手机的使用方法说明文(1)全文共6页,当前为第3页。华为智能手机的...

    Javascript中使用A标签获取当前目录的绝对路径方法

    然而,location没有一个属性能直接获得当前目录(不含文件名)的绝对路径。通过Google我发现了一些错误的方法,比如说把URL通过“/”分离成数组,把数组的最后一项去掉以后再连接成字符串。但如果URL中没有指定...

    架设代理服务器方法教程.docx

    架设代理服务器方法教程全文共2页,当前为第1页。架设代理服务器方法教程全文共2页,当前为第1页。架设代理服务器方法教程 架设代理服务器方法教程全文共2页,当前为第1页。 架设代理服务器方法教程全文共2页,当前...

    .net50个常用方法简单华丽的分页控件功能大的分页控件 50个实用方法

    ///ElseIpAddr()调用此方法 返回当前登录的省市IP地址 ///ElseDataTimeIng()返回本地电脑的当前日期的年月日时分秒 动态的显示 JS实现 ///ElsePageLoad()页面加载数据加载完成呈现页面 ///ElseCkeck()返回...

Global site tag (gtag.js) - Google Analytics