Cycle Finder Ferramenta

Uso

Aqui está um exemplo simples com um ciclo entre duas classes, Foo e 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.

Na saída, você verá primeiro acceptAST para cada arquivo Java que está sendo analisado. Isso é apenas um registro informativo.

Para cada ciclo, serão impressas duas listas. A primeira lista contém uma descrição do ciclo. Cada linha lista uma aresta no gráfico de referência. A descrição da borda vai mostrar o tipo de origem seguido por uma descrição de como o tipo de origem pode se referir ao de destino.

A segunda lista, em Full Types, mostra as chaves de tipo exclusivas para cada tipo no ciclo. Isso é útil porque fornece o pacote completo de cada tipo.

Suprimir listas

Alguns ciclos detectados não exigem ações corretivas. Isso pode ocorrer porque o ciclo contém objetos de longa duração que não precisam ser desalocados. Ou a ferramenta pode detectar um ciclo teórico com base nos tipos de certos campos em que é provado que os objetos envolvidos nunca formarão um ciclo. Nesses casos, podemos usar arquivos de lista de supressão para não relatar esses ciclos.

A ferramenta aceita arquivos de lista de supressão usando a opção --suppress-list. Os arquivos de lista de supressão são arquivos de texto simples que contêm entradas de uma linha. Uma entrada de lista de supressão pode assumir uma das quatro formas demonstradas no exemplo abaixo. Ao adicionar entradas da lista de supressão, é recomendável ser o mais específico possível para evitar a supressão de um ciclo legítimo. Os comentários podem ser adicionados usando o símbolo '#' caractere.

# 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