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.

출력에는 먼저 파싱되는 각 자바 파일의 acceptAST이 표시됩니다. 이는 단지 정보를 제공하는 로깅입니다.

각 주기마다 두 개의 목록이 출력됩니다. 첫 번째 목록에는 생리 주기에 대한 설명이 있습니다. 각 선에는 참조 그래프의 에지가 표시됩니다. 에지 설명에는 출처 유형이 표시되고 이어서 출처 유형이 대상 유형을 참조하는 방식에 관한 설명이 표시됩니다.

Full Types 아래의 두 번째 목록은 주기 내 각 유형의 고유 유형 키를 보여줍니다. 이는 각 유형의 전체 패키지를 제공하므로 유용합니다.

목록 숨기기

감지된 생리 주기 중 일부는 수정 조치가 필요하지 않습니다. 주기에는 할당 해제할 필요가 없는 장기 객체가 포함되어 있기 때문일 수 있습니다. 또는 관련 객체가 하나의 주기를 형성하지 않는다는 것이 입증된 특정 필드의 유형을 기반으로 이론적 주기를 감지할 수도 있습니다. 이러한 경우 억제 목록 파일을 사용하여 이러한 주기를 보고하지 않을 수 있습니다.

도구는 --suppress-list 옵션을 사용하여 비표시 목록 파일을 허용합니다. 비표시 목록 파일은 한 줄 항목을 포함하는 일반 텍스트 파일입니다. 비표시 목록 항목은 아래 예에 설명된 네 가지 형식 중 하나를 취할 수 있습니다. 차단 목록 항목을 추가할 때는 적법한 주기를 억제하지 않으려면 최대한 구체적으로 지정하는 것이 좋습니다. '#' 문자를 사용하여 코멘트를 추가할 수 있습니다.

# 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