2016-12-07 11 views
0

Java TreePathScanner API를 사용하여 주어진 컴파일에서 생성 될 클래스 파일 목록을 확인하려고합니다. 예를 들어, 다음 소스 코드 :Java TreePathScanner가 본문이없는 새 클래스 문에 대해 visitClass를 호출하지 않습니다.

public class InnerClass { 
    private final InnerInnerClass clazz = new InnerInnerClass(); 

    private class InnerInnerClass { 
    } 
} 

는 다음과 같은 파일을 생성합니다

  • InnerClass.class을
  • InnerClass $ 1.class
  • InnerClass $ InnerInnerClass.class

그러나 TreePathScanner 하위 클래스에서 visitClass는 InnerClass 클래스에 대해 두 번만 호출되고 I nnerInnerClass 클래스이지만 새 클래스 문에서 만든 익명으로 명명 된 클래스는 아닙니다. 예상대로 다음 작품에 대한 소스 변경 :

public class InnerClass { 
    private final InnerInnerClass clazz = new InnerInnerClass() { }; 

    private class InnerInnerClass { 
    } 
} 

내 도구의 전체 소스 코드를 참조 할 수 here, 특히 ArtifactScanner.java입니다.

특정 컴파일 단위의 소스 코드에서 생성되는 모든 바이너리 이름을 얻는 다른 방법이 없기 때문에 API의 버그 또는 결함입니다. 내가 놓친 게 있니?

답변

0

this bug report에서 관찰 된 동작이 실제로 버그가 아니며 클래스를 생성하기 전에 더 복잡한 언어 구문을 더 복잡한 언어 구문으로 다시 작성하는 Java 컴파일러 백엔드의 결과로 추가 클래스 파일이 생성되었다고 JDK 개발자 중 한 명이 설명했습니다. 파일.

따라서 TreePathScanner API는이 경우 올바른 출력을 생성하지만 TreePathScanner는 사용 사례 (생성 될 클래스 파일의 목록을 결정하는 데 사용하는 잘못된 솔루션)와 com .sun.source.util.TaskListener, TaskEvent 및 TaskEvent.Kind 및 JavaFileManager.inferBinaryName을 대신 사용해야합니다.