Java最高

通过。开始使用Spring 5和Spring Boot 2学习的春天课程:

>>查看课程

1.概述

有时我们需要知道正在执行的当前Java方法的名称。

这篇快速文章介绍了在当前执行堆栈中获取方法名的两种简单方法。

2.Java 9:栈遍历API

Java 9引入了遍历API以一种懒惰而高效的方式遍历JVM堆栈框架。为了使用这个API找到当前正在执行的方法,我们可以编写一个简单的测试:

public void givenJava9_whenWalkingTheStack_thenFindMethod() {StackWalker walker = StackWalker. getinstance ();可选 methodName = walker。frame .findFirst() .map(StackWalker.StackFrame::getMethodName));assertTrue (methodName.isPresent ());assertequal(“givenJava9_whenWalkingTheStack_thenFindMethod methodName.get ());}

首先,我们得到aStackWalker实例使用getInstance ()工厂方法。然后我们用走()方法从上到下遍历堆栈帧:

  • 走()方法可以转换堆栈帧流流<StackFrame> - - -任何事情
  • 给定流中的第一个元素是堆栈的顶帧
  • 栈顶帧总是表示当前正在执行的方法

因此,如果我们从流中获得第一个元素,我们将知道当前执行的方法细节。更具体地说,我们可以使用StackFrame.getMethodName ()来查找方法名。

2.1。优势

与其他方法相比(稍后会详细介绍),栈遍历API有几个优点:

  • 不需要创建一个虚拟的匿名内部类实例新对象().getClass () {}
  • 不需要创建一个虚拟异常新的Throwable ()
  • 不需要急切地捕获整个stacktrace,这可能会花费很多

相反地,StackWalker只以一种懒惰的方式逐一查看堆栈。在这种情况下,它只获取顶部帧,而stacktrace方法则捕获所有主动帧。

底线是,如果您使用的是Java 9+,请使用栈遍历API。

3.使用getEnclosingMethod

属性可以找到正在执行的方法的名称getEnclosingMethod ()API:

public void givenObject_whenGetEnclosingMethod_thenFindMethod() {String methodName = new Object() {} .getClass() .getEnclosingMethod() .getName();assertequal(“givenObject_whenGetEnclosingMethod_thenFindMethod”,methodName);}

4.使用Throwable堆栈跟踪

使用一个Throwable堆栈跟踪给出了当前正在执行的方法的堆栈跟踪:

public void givenThrowable_whenGetStacktrace_thenFindMethod() {StackTraceElement[] stackTrace = new Throwable().getStackTrace();异常堆栈assertequal(“givenThrowable_whenGetStacktrace_thenFindMethod”,[0].getMethodName ());}

5.使用线程堆栈跟踪

此外,当前线程的堆栈跟踪(从JDK 1.5开始)通常包括正在执行的方法的名称:

public void givenCurrentThread_whenGetStackTrace_thenFindMethod() {StackTraceElement[] stackTrace = Thread.currentThread() .getStackTrace();异常堆栈assertequal(“givenCurrentThread_whenGetStackTrace_thenFindMethod”,[1].getMethodName ());}

但是,我们需要记住这个解决方案有一个显著的缺点。一些虚拟机可能会跳过一个或多个堆栈帧。虽然这种情况并不常见,但我们应该意识到这种情况可能会发生。

6.结论

在本教程中,我们展示了一些如何获取当前执行方法名称的示例。例子是基于堆栈跟踪和getEnclosingMethod ()

一如既往,您可以查看本文中提供的示例在GitHub。同样,Java 9示例在我们的Java 9 GitHub模块

Java底部

通过。开始使用Spring 5和Spring Boot 2学习的春天课程:

>>查看课程
4评论
最古老的
最新的
内联反馈
查看所有评论
本文评论关闭!