Java TreePathScanner 不会为没有正文的新 class 语句调用 visitClass

Java TreePathScanner doesn't call visitClass for new class statements without bodies

我正在尝试使用 Java TreePathScanner API 来确定将从给定编译生成的 class 文件的列表。例如下面的源码:

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

    private class InnerInnerClass {
    }
}

将生成以下文件:

然而,在我的 TreePathScanner 子 class 中,visitClass 只被调用两次,对于 InnerClass class 和 InnerInnerClass classes,而不是匿名命名的 [=39] =] 从新的 class 语句创建。按预期将源更改为以下工作:

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

    private class InnerInnerClass {
    }
}

我的工具的完整源代码可用 here for reference, specifically ArtifactScanner.java

这可能是 API 中的错误或缺陷,因为似乎没有任何其他方法可以获取将从给定编译单元的源代码生成的所有二进制名称。我错过了什么吗?

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

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