在某些情况下,希望能够在代码中打印出调用此方法的方法/类的信息。但是,通常情况下,无法修改调用方法的代码。
解决方案
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;
}