Cycle Finder Outil

Utilisation

Voici un exemple simple illustrant 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 s'agit simplement d'une journalisation informative.

Pour chaque cycle, deux listes sont imprimées. La première liste contient une description du cycle. Chaque ligne correspond à 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 manière dont le type d'origine peut faire référence au type de cible.

La deuxième liste, sous Full Types, indique les clés de type uniques pour chaque type du cycle. Cela est utile, car cela 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 forment jamais un cycle. Dans ce cas, nous pouvons utiliser des fichiers de liste de suppression afin de ne pas signaler ces cycles.

L'outil accepte les fichiers de liste de suppression à l'aide de l'option --suppress-list. Les fichiers Suppress-list sont des fichiers au format texte brut contenant des entrées d'une ligne. Une entrée de liste suppress peut prendre l'une des quatre formes illustrées dans l'exemple ci-dessous. Lorsque vous ajoutez des entrées de liste de suppression, il est recommandé d'être aussi spécifiques que possible pour éviter de supprimer un cycle légitime. Des commentaires peuvent être ajoutés avec le signe "#" .

# 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