2016-12-07 13 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

其中一位JDK开发人员在this bug report上解释说,观察到的行为确实不是一个错误,并且附加的类文件是由Java编译器后端生成的,它在生成类之前将更复杂的语言结构重写为更简单的语言结构文件。

因此,在这种情况下,TreePathScanner API确实会产生正确的输出,但缺点是TreePathScanner是用于我的用例的错误解决方案(确定将生成的类文件的列表)以及该com应该使用.sun.source.util.TaskListener,TaskEvent和TaskEvent.Kind,以及JavaFileManager.inferBinaryName。