【发布时间】:2019-06-30 18:27:00
【问题描述】:
在一个类中,我试图通过使用线程的堆栈跟踪来确定谁最初调用了调用链:
StackTraceElement trace = Thread.getStackTrace();
for (int index = 3; index < trace.length; index++ ) {
String className = trace[index].getClassName();
现在我知道调用将始终由超类型MyObject 发起,但我想知道哪个子类实际开始调用以进行日志记录/审计。
我首先尝试看看我是否可以在逻辑上匹配超类,但即使这样也失败了;我已经尝试了以下所有 4 个,但它们似乎都返回 false:
通过单步执行,我可以看到我在循环中,正确的 className 是我的扩展 MyObject
if (Class.forName(className).isAssignableFrom(MyObject.class)) {
if (MyObject.isAssignableFrom(Class.forName(className))) {
if (Class.forName(className).instanaceOf(MyObject.class)) {
if (MyObject.instanaceOf(Class.forName(className))) {
如果我拥有的类名扩展了某个父级,我还能如何测试?
【问题讨论】:
-
MyObject.instanaceOf(Class.forName(className))[原文如此] 不是您想要的:这是obj instanceof MyObject的动态等效项。如果您没有Class.forName(className)的实例,则不会使用它。
标签: java stack-trace instanceof