Java:为堆栈中的上述方法检索此项

时间:2008-11-27 04:26:21

标签: java

如何获得对当前执行类的几个堆栈帧的引用?例如,如果您有:

Class a { 
    foo() {
        new b().bar();
    }
}

Class b {
    bar() {
        ...
    }
}

有没有办法在线程执行bar()时获取在foo()中使用'this'检索的值?

5 个答案:

答案 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始终是对象的当前实例的引用。因此,thisfoo()的任何使用都将返回A类实例。

答案 4 :(得分:0)

我认为通常不允许Java方法直接访问调用堆栈。

从安全角度来看,您不希望API函数可能访问调用者的数据。