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