這是一個有點棘手的解釋。我有一個A級:如何獲取Java源代碼的完整調用層次結構?
public class A {
private Integer a1;
private Integer a2;
// getters and setters.
}
有返回我的A類靜態類B:
public static class B {
public static A getCurrentA() {
return a;
}
}
我需要找到的B返回A級的所有用途。所以我們假設C班叫c.setA(B.getCurrentA())
,然後再打電話給c.getA().getA2();
,我想要找到所有這些。
在真實場景中,我有217個不同的類,調用B.getCurrentA()
。我無法手動關注Eclipse中的所有調用,並找出哪些方法正在調用。
Eclipse調用層次結構視圖僅顯示我對B.getCurrentA()
的所有調用。
我該如何做到這一點?
編輯
克里斯·海耶斯明白我想做的事情。爲了在不破壞整個系統的情況下重構一些非常糟糕的遺留代碼,我需要首先使用Hibernate的投影來微調一些查詢(系統中的每個映射實體都被急切地加載,並且許多實體是相關的,因此一些查詢需要LONG時間提取一切)。但首先我需要找到哪些屬性使用,以便我沒有得到一個NullPointerException異常的地方......
這裏是什麼,我不得不這樣做手工的例子:
- 使用Eclipse的搜索,找到所有對B.getCurrentA()的調用;
打開找到的第一個方法,讓我們說這是下面的一個:
public class CController { C c = new C(); CFacade facade = new CFacade(); List<C> Cs = new ArrayList<C>(); public void getAllCs() { c.setA(B.getCurrentA()); // found it! facade.search(c); } }
公開賽在CFacade類的搜索方法:
public class CFacade { CBusinessObject cBo = new CBusinessObject(); public List<C> search(C c) { // doing stuff... cBo.verifyA(c); cBo.search(c); // yes, the system is that complicated } }
公開賽在CBusinessObject類的verifyA方法並確定使用了字段a2:
public class CBusinessObject { public void verifyA(c) { if (Integer.valueOf(1).equals(c.getA().getA2())) { // do stuff else { // something else } } }
爲接下來的216場比賽重複步驟2-4 ...是的。
請幫忙。
如果您對'B.getCurrentA()'非常具體的實例感興趣,並且您有權訪問其調用的代碼,則可以將當前堆棧跟蹤打印到日誌。或者在那裏設置一個斷點,然後運行該程序,以便在斷點處停止執行。 – FrustratedWithFormsDesigner
嘗試使用'Thread.dumpStack()'來查看你方法調用的地方 – kajacx
這不僅僅是調用層次結構。你想跟蹤*任何地方返回值的存儲和使用*。這聽起來像是一個靜態分析的巨大任務,試圖確定價值可能傳遞到哪裏。 –