查找实例化对象的类

时间:2014-03-21 09:04:21

标签: java eclipse instance instantiation call-hierarchy

我正在尝试学习不必要的复杂源代码。有一个方法public void passObject(SomeObject someObject),我想知道实例化了哪个类someObject。问题是,当我们遍历调用层次结构时,分支因子非常大。例如,三个方法可以通过someObjectpassObject,在这三个方法之前的三个方法可以分别传递相同的对象。

是否有一些方法可以插入passObject,例如:

public void passObject(SomeObject someObject) {
    whereDidThisComeFrom(someObject); // Should print the class (perhaps) where someObject was instantiated.
    //
    //do the other stuff that passObject is supposed to do.
}

我使用Eclipse

2 个答案:

答案 0 :(得分:3)

最简单/最脏的方法是将(new Exception("test")).printStackTrace()放入SomeObject的构造函数中并运行代码。每次SomeObject实例化时,您都会在控制台上打印堆栈跟踪。

Eclipse还支持构造函数中的断点,因此您可以设置断点并进行调试。

答案 1 :(得分:2)

使用'Show Call Hierachy'确实可以显示太多结果,让您真正了解执行流程。

相反,您可以尝试在调试模式下使用Eclipse,并在passObject(SomeObject someObject)的第一行放置一个断点。然后,您将看到当前的堆栈跟踪。通过检查堆栈跟踪上的代码,您可以确定实际发生的调用层次结构。

或者,如果您无法调试,是否可以向passObject(SomeObject someObject)添加另一行以打印当前堆栈跟踪?有关详细信息,请参阅here