Cycle Finder Narzędzie

Wykorzystanie

Oto prosty przykład połączenia 2 klas: Foo i Bar.

cat Foo.java
package mypkg;
public class Foo {
  Bar myBar;
}

cat Bar.java
package mypkg;
public class Bar {
  Foo myFoo;
}

cycle_finder Foo.java Bar.java
acceptAST: mypkg/Bar.java
acceptAST: mypkg/Foo.java

***** Found reference cycle *****
Bar -> (field myFoo with type Foo)
Foo -> (field myBar with type Bar)
----- Full Types -----
Lmypkg/Bar;
Lmypkg/Foo;

1 CYCLES FOUND.

W danych wyjściowych najpierw zobaczysz ciąg acceptAST dla każdego analizowanego pliku Java. Ma to tylko charakter informacyjny.

Dla każdego cyklu zostaną wydrukowane dwie listy. Pierwsza lista zawiera opis cyklu. Każda linia zawiera krawędź na wykresie referencyjnym. Opis krawędzi zawiera typ punktu początkowego, a następnie opis tego, jak typ punktu początkowego może się odwoływać do typu celu.

Druga lista, w sekcji Full Types, zawiera unikalne klucze typów dla każdego typu w cyklu. Jest to przydatne, ponieważ zapewnia pełny pakiet każdego typu reklam.

Pomiń listy

Niektóre wykryte cykle nie wymagają żadnych działań korygujących. Może to być spowodowane tym, że cykl zawiera długotrwałe obiekty, których nie trzeba konwertować. Narzędzie może też wykryć cykl teoretyczny na podstawie rodzajów określonych dziedzin, w przypadku których udowodniono, że związane z nimi obiekty nigdy nie tworzą cyklu. W takich przypadkach możemy użyć plików listy pomijanych, aby nie zgłaszać tych cykli.

Narzędzie akceptuje pliki z listą pominiętych za pomocą opcji --suppress-list. Pliki listy pomijanej to zwykłe pliki tekstowe zawierające wpisy jednowierszowe. Wpis na liście pomijanych może mieć jedną z 4 postaci przedstawionych w poniższym przykładzie. Zaleca się, aby podczas dodawania pozycji pomijanych na liście były jak najbardziej szczegółowe, aby uniknąć powstrzymania prawidłowego cyklu. Komentarze można dodawać za pomocą znaku „#” znaku.

# Specifies that "fieldA" in ClassA will not refer to any object that is a subtype of ClassB.
FIELD my.pkg.ClassA.fieldA my.pkg.ClassB

# Suppresses all cycles containing "fieldA" in ClassA.
FIELD my.pkg.ClassA.fieldA

# Suppresses all cycles containing any field of ClassA.
TYPE my.pkg.ClassA

# Suppress all cycles containing the Inner's outer reference to ClassA.
OUTER my.pkg.ClassA.Inner

# Suppress all cycles containing the outer reference from an anonymous class declared in myMethod.
OUTER my.pkg.ClassA.myMethod.$

# Suppresses all cycles containing any type in package "my.pkg".
NAMESPACE my.pkg