Cycle Finder Tool

Nutzung

Hier ist ein einfaches Beispiel mit einem Zyklus zwischen den Klassen Foo und 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.

In der Ausgabe sehen Sie zuerst acceptAST für jede zu analysierende Java-Datei. Dies ist nur eine informative Protokollierung.

Für jeden Zyklus werden zwei Listen gedruckt. Die erste Liste enthält eine Beschreibung des Zyklus. Jede Linie zeigt eine Kante im Referenzdiagramm. Die Edge-Beschreibung zeigt den Ursprungstyp, gefolgt von einer Beschreibung, wie sich der Ursprungstyp auf den Zieltyp beziehen könnte.

In der zweiten Liste unter Full Types werden die eindeutigen Typschlüssel für jeden Typ im Zyklus angezeigt. Dies ist nützlich, da es das vollständige Paket jedes Typs zur Verfügung stellt.

Listen unterdrücken

Einige erkannte Zyklen erfordern keine Korrekturmaßnahmen. Dies kann daran liegen, dass der Zyklus langlebige Objekte enthält, die nicht entfernt werden müssen. Oder das Tool kann anhand der Typen bestimmter Felder einen theoretischen Zyklus erkennen, bei dem nachweislich die betroffenen Objekte niemals einen Zyklus bilden werden. In diesen Fällen können wir „suppress-list“-Dateien verwenden, damit diese Zyklen nicht gemeldet werden.

Das Tool akzeptiert Dateien der Unterdrückungsliste mit der Option --suppress-list. Dateien mit Unterdrückungslisten sind Nur-Text-Dateien, die einzeilige Einträge enthalten. Ein Eintrag in einer Unterdrückungsliste kann eines von vier Formen haben, die im folgenden Beispiel gezeigt werden. Es wird empfohlen, beim Hinzufügen von Einträgen der Unterdrückungsliste so genau wie möglich zu sein, um einen legitimen Zyklus zu unterdrücken. Kommentare können mit "#" hinzugefügt werden. Zeichen.

# 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