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