堆栈跟踪
这高度取决于您要查找的内容...但这应该直接在此对象中获取调用此方法的类和方法。
- 索引 0 = 线程
- 索引 1 = 这个
- 索引 2 = 直接调用者,可以是自己。
- 索引 3 ... n = 相互调用以到达索引 2 及以下的类和方法。
对于类/方法/文件名:
Thread.currentThread().getStackTrace()[2].getClassName();
Thread.currentThread().getStackTrace()[2].getMethodName();
Thread.currentThread().getStackTrace()[2].getFileName();
上课:
Class.forName(Thread.currentThread().getStackTrace()[2].getClassName())
仅供参考: Class.forName() 抛出一个不是运行时的 ClassNotFoundException。你需要尝试捕捉。
此外,如果您希望忽略类本身的调用,则必须添加一些带有逻辑的循环来检查该特定事物。
像......(我没有测试过这段代码,所以要小心)
StackTraceElement[] stes = Thread.currentThread().getStackTrace();
for(int i=2;i<stes.length;i++)
if(!stes[i].getClassName().equals(this.getClass().getName()))
return stes[i].getClassName();
StackWalker
StackWalker 堆栈帧
请注意,这不是一个广泛的指南,而是一个可能性示例。
打印每个 StackFrame 的 Class(通过获取 Class 引用)
StackWalker.getInstance(Option.RETAIN_CLASS_REFERENCE)
.forEach(frame -> System.out.println(frame.getDeclaringClass()));
做同样的事情,但首先将流收集到一个列表中。仅用于演示目的。
StackWalker.getInstance(Option.RETAIN_CLASS_REFERENCE)
.walk(stream -> stream.collect(Collectors.toList()))
.forEach(frame -> System.out.println(frame.getDeclaringClass()));