`
enjoyj2ee
  • 浏览: 5034 次
  • 性别: 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  
怎么获取行号的呢?

相关推荐

    python实现得到当前登录用户信息的方法

    ### Python 实现获取当前登录用户信息的方法 在Python编程中,获取当前登录用户的详细信息是一项基本而重要的功能。本文将详细介绍如何在不同的操作系统环境中(包括Linux和Windows)使用Python来获取这些信息,并...

    ASPnet 类库中获得当前路径的方法

    - **示例**:通过以下代码可以获得当前应用域的基目录: ```csharp string baseDirectory = System.AppDomain.CurrentDomain.BaseDirectory; // 输出结果可能为"F:\XFU.NSQS\project\website\bin\" ``` 需要...

    很好用的LOG封装,可同时输出类名,方法名,行数,可控制输出不输出

    通过`Thread.currentThread().getStackTrace()`,我们可以得到一个`StackTraceElement`数组,从中可以获取到调用栈的详细信息,包括类名、方法名和行号。 2. **控制日志输出**:LOG封装往往包含开关机制,允许...

    获得当前计算机系统内某个进程并关闭.txt

    ### 获取并关闭当前计算机系统内某个进程的知识点 在日常的计算机操作中,有时我们需要获取当前计算机系统内的所有运行进程或者特定名称的进程,并且可能还需要关闭这些进程。这一需求在开发过程中尤其常见,比如在...

    C#实现根据指定容器和控件名字获得控件的方法

    在C#中,控件通常被组织在容器(如Form、Panel等)内,而容器本身也可以包含其他控件,形成一个控件树结构。因此,我们需要编写一个方法,能够遍历这个树结构,直到找到具有指定名字的控件。 下面是一个实现这个...

    C#中得到程序当前工作目录和执行目录的一些方法

    通过`System.Diagnostics.Process`类中的`GetCurrentProcess()`方法,可以访问到当前正在运行的进程信息。而`MainModule`属性则返回该进程的主要模块,最后调用`FileName`属性即可获得完整路径。 ### 2. System....

    JSP中得到几种得到路径的方法

    `request.getServletPath()`方法可以获取当前请求的Servlet的路径,它不包含上下文路径,仅返回从Web应用根目录开始的Servlet路径。例如,如果页面位于`jsp`目录下,那么结果将是`/jsp/test.jsp`。这对于在页面内部...

    微信小程序获取当前位置和城市名

    在微信小程序开发中,获取用户当前位置和城市名是常见的需求,尤其对于提供本地化服务的应用来说至关重要。本文将详细介绍如何实现这一功能。 首先,要获取用户的地理位置,必须先获得用户的授权。微信小程序提供了...

    php获取一个对象(类)的所以方法(函数名)

    - `get_class_methods($this)` 直接返回一个数组,包含了 `$this` 对象所属类的所有方法名。 2. **返回值**: - 返回的是一个包含字符串的数组,每个字符串代表一个方法名。 #### 总结 通过以上两种方式,我们...

    Android获取当前运行的类名或者方法

    在Android开发中,有时我们需要获取当前正在执行的类名或方法名,这在调试、日志记录、性能分析等场景非常有用。以下是如何在Android应用中实现这一功能的详细步骤和相关知识点: 首先,Android系统提供了`...

    PowerShell中获取当前运行脚本路径的方法

    ### PowerShell中获取当前运行脚本路径的方法 在PowerShell环境下,获取当前正在执行的脚本的路径是一项常用且实用的功能。这项功能可以帮助我们更灵活地处理脚本内部的文件操作,例如读取或写入与脚本同目录下的...

    Java方法继承、方法重载、方法覆盖总结

    4. **返回类型不同不是重载**: 方法的返回类型不同并不构成重载条件,因为Java编译器是根据方法签名(方法名+参数列表)来进行匹配的。 5. **构造函数也可以重载**: 构造函数同样可以被重载,这意味着一个类可以...

    android获取当前运行Activity名字的方法

    这种方法虽然简单,但由于它依赖于`Context`对象的字符串表示,因此在Service中可能无法得到预期的结果。 接下来是第二种方法,虽然稍显复杂,但更为可靠,而且在所有场景下都能正常工作,前提是你已经在...

    判断当前日期是否在本月的最后一周内

    这段代码定义了一个名为`Function`的类,其中包含四个静态方法分别实现了上述四种日期判断功能。你可以根据实际需求调整这些方法,以适应不同的业务场景。通过这种方式,我们可以有效地处理日期和时间相关的逻辑,...

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

    这种方法简单且易于理解,但是它只能获取到当前执行的函数名,对于函数调用的上下文没有更多的信息。 #### 二、使用 `inspect.stack()` `inspect` 模块提供了一系列工具,可以用来获取关于活动对象的信息,比如类...

    JS获取客户端IP地址、MAC和主机名的7个方法汇总

    ### JS获取客户端IP地址、MAC和主机名的7个方法详解 #### 一、使用JS获取客户端IP的方法 ##### 方法一:使用ActiveX获取IP(仅适用于IE浏览器) 这种方法依赖于`ActiveXObject`来实现,因此只能在允许运行ActiveX...

    web程序或者web服务中获取当前目录的方法

    本文将详细介绍如何在Web程序或Web服务中获取当前目录的方法。 ### 方法一:使用 `System.AppDomain.CurrentDomain.BaseDirectory` 在.NET框架中,`System.AppDomain.CurrentDomain.BaseDirectory` 属性可以用来...

    数值方法求解常微分方程_数值方法解常微分方程_

    然而,由于解析解往往难以获得或者不存在,我们通常需要借助数值方法来求解。 本资料包是关于用MATLAB语言实现数值方法求解常微分方程的一个实例教程。MATLAB是一款强大的数学计算软件,具有丰富的工具箱,其中包括...

    C#获得当前程序的路径

    以下是从标题、描述、标签以及部分内容中提炼出的关键知识点,涵盖了获取当前程序路径的各种方法及其应用场景。 ### 1. System.Environment.CurrentDirectory `System.Environment.CurrentDirectory` 返回当前应用...

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

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

Global site tag (gtag.js) - Google Analytics