2016-12-07 6 views
0

Java TreePathScanner APIを使用して、指定されたコンパイルから生成されるクラスファイルのリストを調べようとしています。たとえば、次のソースコード:Java TreePathScannerが本体なしの新しいクラスステートメントでvisitClassを呼び出さない

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

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

    private class InnerInnerClass { 
    } 
} 

は、以下のファイルが生成されます。

しかし、私のTreePathScannerサブクラスでは、visitClassはInnerClassクラスに対して2回しか呼び出されず、I nnerInnerClassクラスは、新しいクラスステートメントから作成された匿名の名前付きクラスではありません。予想通り、次の作品へのソースを変更する:

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

    private class InnerInnerClass { 
    } 
} 

マイツールの完全なソースコードを参照できるhere、特にArtifactScanner.javaです。

これはAPIのバグまたは欠陥です。特定のコンパイルユニットのソースコードから生成されるすべてのバイナリ名を取得する方法が他にないように思われるためです。何か不足していますか?

答えて

0

this bug reportで観察された振る舞いは実際にはバグではなく、クラスを生成する前に複雑な言語構造を単純なものに書き換えるJavaコンパイラバックエンドの結果として追加のクラスファイルが生成されるファイル。

この場合、TreePathScanner APIは正しい出力を生成しますが、それは、TreePathScannerが、使用されるケース(作成されるクラスファイルのリストを決定する)に間違った解決策であり、 .sun.source.util.TaskListener、TaskEvent、およびTaskEvent.Kind、およびJavaFileManager.inferBinaryNameを代わりに使用する必要があります。

関連する問題