如何检查Java派生类型是否是当前调用堆栈的一部分?
我很难确定派生类类型是否是调用堆栈的一部分 假设我有两个类如何检查Java派生类型是否是当前调用堆栈的一部分?,java,Java,我很难确定派生类类型是否是调用堆栈的一部分 假设我有两个类Base和Derived: class Base { public void foo() { } } class Derived extends Base { } 我有一个Derived的实例,我在其上调用方法foo() Base d = new Derived(); d.foo(); 在调用堆栈下面的某个地方,我想知道当前调用堆栈是否包含类派生的 我想到的第一件事就是使用 StackTraceElement[]
Base
和Derived
:
class Base {
public void foo() {
}
}
class Derived extends Base {
}
我有一个Derived
的实例,我在其上调用方法foo()
Base d = new Derived();
d.foo();
在调用堆栈下面的某个地方,我想知道当前调用堆栈是否包含类派生的
我想到的第一件事就是使用
StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
如中所述
但是,这只提供堆栈跟踪中的Base
类型,而不是派生的
,因为堆栈跟踪看起来像这样:
java.lang.Exception: Stack trace
at java.lang.Thread.dumpStack(Thread.java:1336)
at x.x.x.x.Base.foo(Base.java:1234)
at...
在这种情况下,如何在调用堆栈中检查派生的
编辑:我应该澄清,我更感兴趣的是发现调用堆栈中有一个d
类型为Derived
的对象,而不是我感兴趣的是发现它是Derived
或Base
方法foo()
来自的对象,必须创建派生.class
及其所有祖先类的列表。并检查其中一个类的stacktrace
但是,对于匿名类和嵌入式类来说,情况变得有点复杂。您可以使用globalThreadLocal
,将其设置为foo
条目,并在退出foo
时进行清理。分析堆栈以找出调用了哪个类的方法可能会产生误导。如果Derived
类中foo()
的实现包含super.foo()
?@PavelSmirnov我应该澄清,我更感兴趣的是发现调用堆栈中有一个Derived
类型的对象d
,并不是说我对发现方法foo()
来自派生的或Base
感兴趣,我需要具体检查派生的对象是否存在,如果这些祖先还具有除派生的
之外的其他子类,那么检查派生的
的祖先类将不起作用。对象实例也是未知的。Derived.f()
可以在其他对象上调用Derived.g()
,以此类推。只有调试器才能处理此类问题。也许你想要AOP,面向方面的编程。我希望有一些反射魔法可以帮助你。