如何检查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


但是,对于匿名类和嵌入式类来说,情况变得有点复杂。

您可以使用global
ThreadLocal
,将其设置为
foo
条目,并在退出
foo
时进行清理。分析堆栈以找出调用了哪个类的方法可能会产生误导。如果
Derived
类中
foo()
的实现包含
super.foo()
?@PavelSmirnov我应该澄清,我更感兴趣的是发现调用堆栈中有一个
Derived
类型的对象
d
,并不是说我对发现方法
foo()
来自
派生的
Base
感兴趣,我需要具体检查
派生的
对象是否存在,如果这些祖先还具有除
派生的
之外的其他子类,那么检查
派生的
的祖先类将不起作用。对象实例也是未知的。
Derived.f()
可以在其他对象上调用
Derived.g()
,以此类推。只有调试器才能处理此类问题。也许你想要AOP,面向方面的编程。我希望有一些反射魔法可以帮助你。