在Java 8中获取调用方方法的有效方法?

Nfff3:

这就是我想要实现的目标:如果有一个a()调用method的方法b(),我想知道谁调用了method b()

public void a(){
  b();//but it is not necessarily in the same class
}

public void b(){
  String method = getCallerMethod();//returns 'a'
}

现在,可以使用StackWalkerAPI 在Java 9+中有效地实现这一目标在Java 8中,我可以使用Thread.currentThread().getStackTrace()new Exception().getStackTrace(),但是这两种方法都非常慢。我不需要整个堆栈跟踪,只需要堆栈跟踪中的前一帧,而只需要该帧中方法的名称(可能还需要类名)。

有没有办法在Java 8中有效地实现这一目标?

apangin:
  1. 在JDK 8中,有一个内部未公开的API,它提供对单个堆栈跟踪元素的访问,而无需解码完整的堆栈跟踪:

    SharedSecrets.getJavaLangAccess().getStackTraceDepth(e)
    SharedSecrets.getJavaLangAccess().getStackTraceElement(e, index)
    

    它有助于避免解码堆栈跟踪的巨额成本,但仍需要收集整个跟踪。有关详细信息,请参见此答案

  2. 更快的方法是JVM TI GetStackTrace函数。start_depthmax_frame_count参数仅允许获取堆栈跟踪的选定部分。

    这种方法的缺点是它需要一个本机库。

    我有一个使用它可以满足您所需示例GetStackTraceStackFrame.getLocation(depth)方法在给定深度仅返回一个堆栈帧。

  3. 如果只需要调用者类(没有确切的方法),则快速,标准和可移植的解决方案是

    MethodHandles.lookup().lookupClass()
    
  4. 最后,如果仅需要调用者方法,则另一种解决方案是使用字节码检测找到所有invoke*调用该方法的字节码a,然后将其重写为invoke方法a_with_caller(String callerMethod),其中callerMethodparameter是从检测的方法派生的检测时间常数。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在ElasticSearch中仅获取_id的有效方法-Java

获取调用方方法(java.lang.reflect.Method)

在Java中,对super()参数列表中的静态方法的调用是有效的。为什么?

在Java中的超类上调用抽象方法是否有效

使用Java中的静态方法将有效值返回给调用方

Java8:操作Map的有效方法

在 Java 方法中传递对象参数的有效方法

在Java中对元组列表进行排序的有效方法

从Java中的数组制作直方图的最有效方法

使用Java 8流获取列表集,找到它们的通用元素并对结果进行排序的有效方法

有没有更有效的Java 8 Stream方法可以在int []中查找索引?

是否有更有效的方法使用流从 ResultSet (Java) 中的 int 列获取平均值

Java模式匹配的有效方法

有效的Java:clone()方法的分析

编码Java ResultSet的有效方法

在向 spring-boot 发出 POST 请求时,如何在 java 方法中获取有效负载?

在java 8中从/向LocalDateTime减去/添加“区域差异时间”的最有效方法是什么

使用有效的指针从C调用方法后,Java JNI NullPointerException

Java 8功能映射中的Spring Data JPA保存方法有效性

这是嵌套对象名单的分叉名单有效的方法?java的8 flatmap VS每个?

Java 8-将List <byte []>合并为byte []的最有效方法

Java 8:从列表中将元素收集为TreeMap的有效方法

Java 8,从列表返回重复项(不删除它们)的最有效方法?

Java 8:比较不同类型列表的更有效方法?

让Jackson将Java 8 Instant序列化为毫秒数的有效方法?

Java:更改方法参数的最有效方法

如何在Java中获取有效的子列表?

Java 8 中带有可选参数的调用方法

在Java中检测偶数最有效的方法是什么?