`

Java中查看一个方法被调用的层次(Reflection、StackTrace)

    博客分类:
  • java
阅读更多

package test;

public class Main {
    public static void main(String[] args) {
        new Test().test();
    }
}

package test;

import java.util.Map;
import sun.reflect.Reflection;

public class Test {
    public void test() {
        System.out.println("------------Reflection.getCallerClass(i)------------");
        System.out.println("Reflection.getCallerClass(0)=" + Reflection.getCallerClass(0));
        System.out.println("Reflection.getCallerClass(1)=" + Reflection.getCallerClass(1));
        System.out.println("Reflection.getCallerClass(2)=" + Reflection.getCallerClass(2));
        System.out.println("Reflection.getCallerClass(3)=" + Reflection.getCallerClass(3));
        System.out.println("Reflection.getCallerClass(4)=" + Reflection.getCallerClass(4));

        System.out.println("\n------------new Throwable().getStackTrace()------------");
        StackTraceElement[] elements = new Throwable().getStackTrace();
        for (int i = 0; i < elements.length; i++) {
            System.out.println(elements[i]);
        }

        System.out.println("\n------------Thread.currentThread().getStackTrace()------------");
        elements = Thread.currentThread().getStackTrace();
        for (int i = 0; i < elements.length; i++) {
            System.out.println(elements[i]);
        }

        System.out.println("\n------------Thread.getAllStackTraces()------------");
        Map<Thread, StackTraceElement[]> map = Thread.getAllStackTraces();
        elements = map.get(Thread.currentThread());
        for (int i = 0; i < elements.length; i++) {
            System.out.println(elements[i]);
        }
    }

}

运行结果:

------------Reflection.getCallerClass(i)------------
Reflection.getCallerClass(0)=class sun.reflect.Reflection
Reflection.getCallerClass(1)=class test.Test
Reflection.getCallerClass(2)=class test.Main
Reflection.getCallerClass(3)=null
Reflection.getCallerClass(4)=null

------------new Throwable().getStackTrace()------------
test.Test.test(Test.java:33)
test.Main.main(Main.java:5)

------------Thread.currentThread().getStackTrace()------------
java.lang.Thread.getStackTrace(Thread.java:1426)
test.Test.test(Test.java:39)
test.Main.main(Main.java:5)

------------Thread.getAllStackTraces()------------
java.lang.Thread.dumpThreads(Native Method)
java.lang.Thread.getAllStackTraces(Thread.java:1477)
test.Test.test(Test.java:45)
test.Main.main(Main.java:5)

分享到:
评论

相关推荐

    前端项目-stacktrace.js.zip

    例如,`StackTrace.get()`方法会返回一个Promise,解析后得到一个堆栈帧数组,每个堆栈帧包含了关于函数调用的所有关键信息。 值得注意的是,stacktrace.js还支持插件系统,这使得它可以适应不同的环境和需求。比如...

    matlab开发-用StackTrace替换键盘

    它可能包含了一个自定义的调试函数,用来替代`keyboard`,在遇到特定条件或触发器时,调用`dbstack`并输出堆栈信息,而不会中断程序的执行。这使得开发者可以在不打断代码流程的情况下,获得类似`keyboard`提供的上...

    asp.net(c#)的异常处理,StackTrace说明,获得错误位置

    利用 Exception 的StackTrace 属性获得错误的文件的位置(文件名,行号),并将错误信息保存在一个.config的文件里,内容有: 如何获取错误 如何获取错误的位置,多层开发时,在类用应用此法方便查错 如保获取站点的...

    dotnet 警惕使用 StackTrace 加获取方法标记 Attribute 特性在 Release 下被内联.rar

    标题中的“dotnet 警惕使用 StackTrace 加获取方法标记 Attribute 特性在 Release 下被内联”提示我们关注的是.NET(dotnet)开发中关于StackTrace类的一个问题,特别是如何在Release模式下正确处理方法的Attribute...

    从StackTrace获取调用程序集

    要获取调用程序集,我们首先需要创建一个StackTrace对象。这可以通过在异常处理代码中或者在需要检查堆栈跟踪的任何地方,使用StackTrace的构造函数来完成。例如: ```csharp StackTrace stackTrace = new Stack...

    Atom-stacktrace,用于导航stacktraces的atom包。通过在github上创建一个帐户为smashwilson/stacktrace开发做出贡献。.zip

    Atom-stacktrace就是这样一个插件,专门针对开发者在调试代码时遇到的堆栈跟踪问题提供解决方案。 堆栈跟踪(stacktrace)是程序运行过程中出现错误或异常时生成的一种信息报告,它记录了错误发生时调用函数的顺序...

    JCL_Debug_StackTrace_Demo

    标题“JCL_Debug_StackTrace_Demo”表明这是一个关于使用JCL进行调试和显示堆栈跟踪的示例项目。堆栈跟踪是在程序运行时记录函数调用序列的一种技术,它可以帮助开发者迅速定位错误发生的具体位置。在Delphi7中,JCL...

    Obtaining a stack trace in C upon SIGSEGV

    核心部分在于定义了一个信号处理函数,该函数会在接收到 `SIGSEGV` 信号时被调用。这个处理函数会调用 `backtrace()` 函数来获取当前的堆栈轨迹,并通过 `backtrace_symbols()` 函数解析出对应的函数名。最后,它将...

    开源项目-palantir-stacktrace.zip

    在Java编程中,当程序遇到异常时,会生成堆栈跟踪(Stack Trace),显示了异常发生时程序执行的顺序,包括调用的方法、类和行号。然而,原始的堆栈跟踪信息往往冗长且难以快速定位问题。Palantir的StackTrace库提供...

    Java 异常的栈轨迹(Stack Trace)详解及实例代码

    Java 异常的栈轨迹(Stack Trace)是指在 Java 程序中抛出异常时,记录下异常的发生位置和调用过程的信息。这种信息对于调试和排查问题非常重要。 1.printStackTrace() 方法 printStackTrace() 方法是 Throwable ...

    cpp-stacktrace:快速简单的C ++堆栈跟踪

    在C++编程中,堆栈跟踪(stack trace)是一个非常重要的工具,它允许开发者查看程序运行时调用函数的顺序,这对于调试和问题排查极为有用。`cpp-stacktrace`项目提供了一种快速且简单的方式来实现C++的堆栈跟踪功能...

    前端开源库-atma-loader-stacktrace

    "atma-loader-stacktrace"是一个专为前端开发者设计的开源库,其核心功能是处理和增强JavaScript运行时的堆栈跟踪信息。这个库的主要目标是为编译和缩小后的脚本提供清晰、有用的堆栈跟踪,帮助开发者更好地诊断和...

    Java Reflection (JAVA反射)

    在这个例子中,我们创建了一个名为`A`的简单类,然后通过反射判断一个`Integer`对象和一个`A`对象是否属于`A`类。结果表明,只有`A`对象才是`A`类的实例。 3. **示例三:调用方法** ```java import java.lang....

    A beautiful stack trace pretty printer for C++.zip

    当一个函数被调用时,它的栈帧被压入栈顶;当函数返回时,栈帧被弹出。 3. **异常处理**:在C++中,异常处理通过`try`、`catch`和`throw`关键字实现。异常发生时,栈跟踪可以帮助识别异常发生的具体位置和调用栈的...

    JAVA调用zpl条码打印机打印实现中文打印。

    以下是一个简单的步骤概述: 1. 创建Socket连接:使用`Socket`类的`connect()`方法连接到打印机的IP地址和端口号。 2. 获取OutputStream:通过`Socket`对象的`getOutputStream()`方法获取输出流,用于发送ZPL指令到...

    stacktrace.js:在所有Web浏览器中生成,解析和增强JavaScript堆栈跟踪

    stacktrace.js使用浏览器的Error.stack机制生成堆栈跟踪,对其进行解析,并使用对其进行增强,并使用返回一个数组。 正在升级? 检查 用法 从当前位置获取堆栈跟踪 var callback = function ( stackframes ) { var...

    Android studio 出现错误Run with --stacktrace option to get the stack trace. Run with --info or --debu

    主要介绍了 Android studio 出现错误Run with --stacktrace option to get the stack trace. Run with --info or --debu的相关资料,需要的朋友可以参考下

Global site tag (gtag.js) - Google Analytics