如何获得对当前执行类的几个堆栈帧的引用?例如,如果您有:
Class a {
foo() {
new b().bar();
}
}
Class b {
bar() {
...
}
}
有没有办法在线程执行bar()时获取在foo()中使用'this'检索的值?
答案 0 :(得分:1)
Thread.getStackTrace()
获取一些调试信息。
答案 1 :(得分:1)
正如其他人所说,你会希望你的较低方法被传递给更高方法的类实例并以此方式获得它。
e.g:
Class A {
foo() {
new b().bar(this);
}
}
Class B {
bar(A aInstance) {
...
}
}
答案 2 :(得分:1)
你有三个选择。您可以将调用对象传递给bar方法:
Class A {
foo() {
new B().bar(this);
}
}
Class B {
bar(A caller) {
...
}
}
或者你可以使B类成为A类的内部类:
Class A {
foo() {
new B().bar();
}
Class B {
bar() {
A caller=A.this;
...
}
}
}
如果您只需要Class而不是对象实例,那么您有第三种选择。通过使用Thread.currentThread().getStackTrace()
,您可以在堆栈中的任意点获取类的限定名称,并使用反射来获取类实例。但这太可怕了,你应该修复你的设计,或者(如果你正在编写自己的调试器或类似的东西)尝试一个更简单的项目,直到你对java有足够的了解为自己想出这样的事情......
答案 3 :(得分:0)
this
始终是对象的当前实例的引用。因此,this
中foo()
的任何使用都将返回A类实例。
答案 4 :(得分:0)
我认为通常不允许Java方法直接访问调用堆栈。
从安全角度来看,您不希望API函数可能访问调用者的数据。