To jest trochę trudne do wytłumaczenia. Mam Klasa A:Jak uzyskać pełną hierarchię połączeń kodu źródłowego Java?
public class A {
private Integer a1;
private Integer a2;
// getters and setters.
}
Jest statyczna klasa B, która zwraca moją Klasa A:
public static class B {
public static A getCurrentA() {
return a;
}
}
muszę znaleźć wszystkie zwyczaje klasy A zwracane przez B. Powiedzmy, że klasa C zadzwoni na numer c.setA(B.getCurrentA())
, a następnie będzie wywoływać numer c.getA().getA2();
. Chciałbym je wszystkie znaleźć.
W prawdziwym scenariuszu mam 217 różnych klas, które wywołują B.getCurrentA()
. Nie mogę ręcznie śledzić wszystkich wywołań w Eclipse i dowiedzieć się, które metody są wywoływane.
Widok hierarchii połączeń Eclipse wyświetla tylko wszystkie połączenia z B.getCurrentA()
.
Jak mogę to osiągnąć?
EDIT
Chris Hayes rozumieć to, co chcę robić. W celu refaktoryzacji naprawdę złego kodu starszego bez przerywania całego systemu, muszę najpierw dokładnie dostroić niektóre zapytania za pomocą projekcji Hibernate'a (każda zmapowana jednostka w systemie jest niecierpliwie załadowana, a wiele encji jest powiązanych, więc niektóre zapytania trwają długo czas przynosi wszystko). Ale najpierw muszę dowiedzieć się, jakie właściwości są używane tak, aby nie uzyskać NullPointerException gdzieś ...
Oto przykład tego, co musiałbym zrobić ręcznie: Szukaj
- Skorzystaj z Eclipse do znajdź wszystkie wywołania do B.getCurrentA();
otwarta pierwsza metoda znaleźć, powiedzmy, że jest to jeden poniżej:
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); } }
Otwarta metoda wyszukiwania w klasie 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 } }
Otwarta metoda verifyA w klasie CBusinessObject i określić, że pole a2 jest używane:
public class CBusinessObject { public void verifyA(c) { if (Integer.valueOf(1).equals(c.getA().getA2())) { // do stuff else { // something else } } }
Powtórz kroki 2-4 dla kolejnych 216 dopasowań ... Yay.
Proszę o pomoc.
Jeśli interesuje Cię bardzo specyficzne wystąpienie 'B.getCurrentA()' i masz dostęp do kodu, w którym jest on wywoływany, możesz być w stanie wydrukować bieżący ślad stosu do dziennika. Lub ustaw tam punkt przerwania, a następnie uruchom program, aby wykonywanie zostało zatrzymane w punkcie przerwania. – FrustratedWithFormsDesigner
Wypróbuj 'Thread.dumpStack()', aby zobaczyć, z której metody została wywołana – kajacx
To znacznie więcej niż hierarchia połączeń. Chcesz śledzić * wszędzie, gdzie zwrócona wartość jest przechowywana i używana *. Brzmi to jak monumentalne zadanie analizy statycznej, aby spróbować określić, do której wartości może dotrzeć. –