Cycle Finder Công cụ
Cách sử dụng
Dưới đây là ví dụ đơn giản với chu kỳ giữa hai lớp, Foo và 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.
Trong đầu ra, trước tiên, bạn sẽ thấy acceptAST
cho mỗi tệp java được phân tích cú pháp. Đây chỉ là thông tin ghi nhật ký.
Đối với mỗi chu kỳ, hệ thống sẽ in 2 danh sách. Danh sách đầu tiên chứa nội dung mô tả về chu kỳ. Mỗi dòng liệt kê một cạnh trong biểu đồ tham chiếu. Phần mô tả cạnh sẽ hiển thị loại nguồn gốc, theo sau là nội dung mô tả về cách mà loại nguồn gốc có thể tham chiếu đến loại mục tiêu.
Danh sách thứ hai, bên dưới Full Types
là các khoá loại duy nhất cho từng loại trong chu kỳ. Điều này rất hữu ích vì nó cung cấp gói đầy đủ của mỗi loại.
Danh sách loại bỏ
Bạn không cần làm gì để khắc phục đối với một số chu kỳ đã phát hiện. Điều này có thể là do chu trình chứa các đối tượng tồn tại lâu dài không cần được phân bổ. Hoặc công cụ này có thể phát hiện một chu kỳ lý thuyết dựa trên các loại trường nhất định mà có thể chứng minh được rằng các đối tượng liên quan sẽ không bao giờ hình thành một chu kỳ. Đối với những trường hợp như vậy, chúng tôi có thể sử dụng tệp danh sách loại bỏ để không báo cáo các chu kỳ này.
Công cụ này chấp nhận các tệp danh sách loại bỏ bằng cách sử dụng tuỳ chọn --suppress-list
. Tệp danh sách chặn là tệp văn bản thuần tuý chứa các mục nhập một dòng. Mục nhập danh sách loại bỏ có thể ở một trong 4 dạng được minh hoạ trong ví dụ bên dưới. Bạn nên thêm các mục trong danh sách loại bỏ càng cụ thể càng tốt để tránh loại bỏ một chu kỳ hợp lệ. Bạn có thể thêm nhận xét bằng phím "#" .
# 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