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