当前位置: 首页 > 知识库问答 >
问题:

寻找能够识别调用它的方法的Java方法

吕鸿轩
2023-03-14

我一直在为我的Java项目开发一个小型日志/调试库。我知道已经有很多好的方法了,但我想从自己做一个中学习。

作为这个库的一部分,我希望有一种方法是能够在任何时候找出你在哪个方法中,类似于C中的__func__。大多数时候,只要使用StackTrace就可以找到它,因为您通常不需要比方法的名称(和/或声明类)更多的东西,但是我希望能够将方法作为java.lang.reflect.方法

做这件事最简单的方法是简单地做

Method currentMethod = new Object() {}.getClass().getEnclosingMethod();

这将很好地工作,但是如果不在方法本身中创建“new Object(){}”,我无法找到一种方法来做同样的事情。理想情况下,如果我能做一个简单的

Method currentMethod = _method();

为了得到相同的结果,但用我目前的方法,它只会给我_method本身的方法实例。

有没有已知的方法来实现这一点?如果没有,也没关系,但是有一个就好了。

编辑:我收到的很多建议,比如这篇文章,主要是提供给你方法名称的答案。可以使用该方法(以及以相同方式获得的类信息)来查找该方法,但前提是所讨论的类只有一个具有该名称的方法。同名但参数不同的方法无法用此标识!

共有1个答案

严斌
2023-03-14

StackWalker可以做到:

public Method getCallingMethod() {
    Set<StackWalker.Option> options =
        EnumSet.of(StackWalker.Option.RETAIN_CLASS_REFERENCE);
    StackWalker.StackFrame frame =
        StackWalker.getInstance(options, 3).walk(
            s -> s.skip(2).findFirst()).get();

    try {
        return frame.getDeclaringClass().getDeclaredMethod(
            frame.getMethodName());
    } catch (ReflectiveOperationException e) {
        throw new RuntimeException(e);
    }
}
 类似资料:
  • 问题内容: 我有这段代码在做Range Minimum Query 。当t = 100000时,i和j始终在每条输入行中更改,因此在Java 8u60中其执行时间约为12秒。 当我提取一个新方法以找到最小值时,执行时间快了4倍(约2.5秒)。 我一直认为方法调用很慢。但是这个例子却相反。Java 6也演示了这一点,但是在两种情况下(17秒和10秒)执行时间都慢得多。有人可以对此提供一些见识吗? 问

  • 我有一段代码在做最小范围查询。当t=100000时,i和j在每个输入行中总是发生变化,其在Java8u60中的执行时间约为12秒。 当我提取一个新方法来寻找最小值时,执行时间快了4倍(大约2.5秒)。 我一直认为方法调用很慢。但是这个例子显示了相反的情况。Java6也演示了这一点,但是两种情况下的执行时间都要慢得多(17秒和10秒)。有人能对此提供一些见解吗?

  • 我有以下代码,没有编译: 其中返回。 它不识别< code>asScala方法。将导入< code > Scala . JDK . future converters . _ 库。我做错了什么?

  • 引用脚本的内容: name 'Find Control IDs' outfile 'findctlID_MUI.exe' showinstdetails show InstallDir '$EXEDIR' var header !include mui.nsh ; 许可协议页面 !define MUI_PAGE_CUSTOMFUNCTION_PRE lic_pre !define MUI_P

  • 问题内容: 我正在使用石英进行日程安排。 它接受5个参数。(秒,分钟,小时,daysOfMonth,月份)。 当我通过第四个参数作为“ 09”。Eclipse给我错误“ int类型的文字八进制09(数字9)超出范围”。 但是,当我将第四个参数作为“ 9”而不是“ 09”传递时,它起作用了。 谁能解释这个错误? 问题答案: 在Java中,如果要定义整数,则前导“ 0”将表示您正在以八进制定义数字

  • 问题内容: 我需要获取所有调用者方法的列表,以获取Java感兴趣的方法。有什么工具可以帮助我吗? 编辑:我忘了提到我需要从程序中执行此操作。我使用的是Java Pathfinder,我想将其作为调用我感兴趣的方法的所有方法来运行。 问题答案: 为了分析字节码,我建议使用ASM。给定要分析的类列表,可以使访问者找到您感兴趣的方法调用。下面是一个分析jar文件中类的实现。 请注意,ASM使用带有’/’