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