Cycle Finder 工具

使用方法

以下是一個在 Foo 和 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.

在輸出內容中,系統會先針對每個剖析的 Java 檔案顯示 acceptAST。這只是提供資訊的記錄功能。

每個週期都會輸出兩份清單。第一份清單包含循環的說明。每一行都會列出參考圖表中的一個邊緣。邊緣說明會顯示來源類型,後面附上來源類型如何參照目標類型的說明。

第二份清單 Full Types 下方會顯示週期中每種類型的專屬類型鍵。這非常實用,因為其提供了每種類型的完整套件。

隱藏清單

偵測到的某些週期無須採取任何修正動作。這可能是因為月經週期含有不需要取消配置的長效物件。或者,此工具可根據特定欄位的類型,偵測理論週期,其中所涉及的物體絕不會形成循環。針對這類情況,我們可以使用隱藏清單檔案來不回報這些循環。

此工具接受使用 --suppress-list 選項隱藏清單檔案。傳輸清單檔案是包含單行項目的純文字檔案。隱藏清單項目可能會從以下範例所示的 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