Cycle Finder ツール

用途

Foo と Bar の 2 つのクラスを循環させる簡単な例を次に示します。

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.

出力には、まず、解析される Java ファイルごとに acceptAST が表示されます。これは単なる情報のためのロギングです。

サイクルごとに、2 つのリストが印刷されます。最初のリストには、周期の説明が入ります。各線は、参照グラフ内のエッジを示しています。エッジの説明には、オリジンのタイプが表示され、続いてオリジン タイプがターゲット タイプをどのように参照するかの説明が表示されます。

Full Types の下にある 2 番目のリストには、サイクル内の各タイプの一意のキーが表示されます。各型の完全なパッケージが提供されるため、これは便利です。

リストを抑制

検出された生理周期の一部については、是正措置は不要です。これは、割り当て解除の必要がない有効期間が長いオブジェクトがサイクルに含まれていることが原因である可能性があります。または、関係するオブジェクトがサイクルを形成しないことが証明できる特定のフィールドの種類に基づいて、理論的なサイクルを検出する場合もあります。このような場合は、suppress-list ファイルを使用して、これらのサイクルを報告しないようにすることができます。

このツールは、--suppress-list オプションを使用して抑制リスト ファイルを受け入れます。抑制リスト ファイルは、1 行のエントリを含む書式なしテキスト ファイルです。抑制リストのエントリは、下記の例に示す 4 つの形式のいずれかを取ります。正当なサイクルの抑制を避けるため、抑制リストのエントリを追加する場合は、できるだけ具体的にすることをおすすめします。コメントを追加するには、「#」をあります。

# 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