Cycle Finder Công cụ

Cách sử dụng

Sau đây là một ví dụ đơn giản về 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 dữ liệu đầu ra, trước tiên, bạn sẽ thấy acceptAST cho từng tệp java đang được phân tích cú pháp. Đây chỉ là nhật ký cung cấp thông tin.

Đối với mỗi chu kỳ, sẽ có hai danh sách được in ra. 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 loại nguồn gốc có thể tham chiếu đến loại mục tiêu.

Danh sách thứ hai trong Full Types cho thấy các khoá loại duy nhất cho mỗi kiểu 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.

Loại bỏ danh sách

Bạn sẽ không cần khắc phục đối với một số chu kỳ phát hiện được. Điều này có thể là do chu kỳ chứa các đối tượng tồn tại lâu không cần giải phóng. Hoặc công cụ có thể phát hiện 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ờ tạo thành chu kỳ. Đối với những trường hợp như vậy, chúng ta có thể sử dụng tệp danh sách chặn để không báo cáo các chu kỳ như vậy.

Công cụ này chấp nhận các tệp trong danh sách chặn bằng cách sử dụng tuỳ chọn --suppress-list. Tệp trong danh sách chặn là các 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 chặn có thể có một trong 4 dạng được minh hoạ trong ví dụ dưới đây. Bạn nên thêm các mục trong danh sách chặn càng cụ thể càng tốt để tránh việc loại bỏ một chu kỳ hợp pháp. Bạn có thể thêm nhận xét bằng ký tự "#".

# 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