Cycle Finder Outil

Utilisation

Voici un exemple simple avec un cycle entre deux classes, Foo et 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.

Dans le résultat, vous verrez d'abord acceptAST pour chaque fichier Java analysé. Il ne s'agit que d'une journalisation informative.

Pour chaque cycle, deux listes s'affichent. La première liste contient une description du cycle. Chaque ligne indique une arête dans le graphique de référence. La description de l'arête affiche le type d'origine, suivi d'une description de la façon dont ce type d'origine peut faire référence au type de cible.

La deuxième liste, sous Full Types, affiche les types de clés uniques pour chaque type du cycle. Cela est utile, car il fournit le package complet de chaque type.

Supprimer les listes

Certains cycles détectés ne nécessitent aucune action corrective. Cela peut être dû au fait que le cycle contient des objets de longue durée qui n'ont pas besoin d'être désaffectés. L'outil peut également détecter un cycle théorique basé sur les types de certains champs, pour lequel il est prouvé que les objets impliqués ne formeront jamais un cycle. Dans ce cas, nous pouvons utiliser des fichiers suppress-list pour ne pas indiquer ces cycles.

L'outil accepte les fichiers de liste de suppression à l'aide de l'option --suppress-list. Les fichiers de liste de suppression sont des fichiers au format texte brut contenant des entrées d'une ligne. Une entrée de liste de suppression peut prendre l'une des quatre formes présentées dans l'exemple ci-dessous. Lorsque vous ajoutez des entrées de liste de suppression, nous vous recommandons d'être aussi précis que possible pour éviter de supprimer un cycle légitime. Il est possible d'ajouter des commentaires à l'aide du caractère "#".

# 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