如何追踪调用你的方法的方法/类

在某些情况下,希望能够在代码中打印出调用此方法的方法/类的信息。但是,通常情况下,无法修改调用方法的代码。

解决方案

Java

在 Java 中,可以使用 Thread.currentThread().getStackTrace() 方法来获取当前线程的调用栈信息。调用栈信息是一个包含 StackTraceElement 对象的数组,每个 StackTraceElement 对象代表一个方法调用。通过索引访问调用栈信息数组,可以获取调用此方法的方法/类的信息。例如:

public class GetCallerClass {

    public static void main(String[] args) {
        // 获取当前线程的调用栈信息
        StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();

        // 获取调用此方法的方法/类信息
        StackTraceElement caller = stackTrace[2];
        String callerClassName = caller.getClassName();
        String callerMethodName = caller.getMethodName();

        // 打印调用此方法的方法/类信息
        System.out.println("调用此方法的方法/类:");
        System.out.println("类名:" + callerClassName);
        System.out.println("方法名:" + callerMethodName);
    }
}

Python

在 Python 中,可以使用 inspect 模块来获取调用此方法的方法/类的信息。inspect 模块提供了一些函数,可以用于获取函数的名称、文件名、参数等信息。例如:

import inspect

def caller_info():
    # 获取当前调用栈信息
    frame = inspect.currentframe().f_back

    # 获取调用此方法的方法/类信息
    caller_class_name = frame.f_code.co_name
    caller_method_name = frame.f_code.co_name

    # 打印调用此方法的方法/类信息
    print("调用此方法的方法/类:")
    print("类名:" + caller_class_name)
    print("方法名:" + caller_method_name)

def main():
    caller_info()

if __name__ == "__main__":
    main()

JavaScript

在 JavaScript 中,可以通过 Error 对象来获取调用此方法的方法/类的信息。Error 对象包含一个 stack 属性,该属性是一个包含调用栈信息(函数调用位置)的字符串。例如:

function callerInfo() {
    // 获取调用栈信息
    var stack = new Error().stack;

    // 解析调用栈信息,获取调用此方法的方法/类信息
    var callerInfo = stack.split("\n")[2];
    var callerClassName = callerInfo.split("at ")[1].split(" ")[0];
    var callerMethodName = callerInfo.split("at ")[1].split(" ")[1];

    // 打印调用此方法的方法/类信息
    console.log("调用此方法的方法/类:");
    console.log("类名:" + callerClassName);
    console.log("方法名:" + callerMethodName);
}

function main() {
    callerInfo();
}

main();

C++

在 C++ 中,可以通过 PRETTY_FUNCTION 宏来获取调用此方法的方法/类的信息。PRETTY_FUNCTION 宏是一个包含调用栈信息(函数调用位置)的字符串。例如:

#include <iostream>

using namespace std;

void callerInfo() {
    // 获取调用栈信息
    string stack = __PRETTY_FUNCTION__;

    // 解析调用栈信息,获取调用此方法的方法/类信息
    size_t pos = stack.find("::");
    string callerClassName = stack.substr(0, pos);
    string callerMethodName = stack.substr(pos + 2);

    // 打印调用此方法的方法/类信息
    cout << "调用此方法的方法/类:" << endl;
    cout << "类名:" << callerClassName << endl;
    cout << "方法名:" << callerMethodName << endl;
}

int main() {
    callerInfo();

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值