我正在尝试使用Java TreepathScanner API确定将从给定编译生成的类文件列表。例如,以下源代码:
public class InnerClass {
private final InnerInnerClass clazz = new InnerInnerClass();
private class InnerInnerClass {
}
}
将生成以下文件:
- innerclass.class
- InnerClass $ 1.Class
- InnerClass $ inneinnerclass.class
然而,在我的TreepathScanner子类中,VistClass仅被称为InnerClass类和InnerInnerClass类两次,而不是从新类别语句中创建的匿名类。根据预期将源更改为以下工作:
public class InnerClass {
private final InnerInnerClass clazz = new InnerInnerClass() { };
private class InnerInnerClass {
}
}
我的工具的完整源代码可在此处提供参考,特别是ArtifactScanner.java。
这是API中的错误或缺陷,因为似乎没有其他方法可以从给定的编译单元的源代码中获取所有将生成的二进制名称。我想念什么吗?
JDK开发人员之一在此错误报告上解释说,观察到的行为确实不是一个错误,并且由于Java编译器后端而生成了其他类文件,该文件会重新写出更多在生成类文件之前,复杂的语言构造成简单的语言。
因此,在这种情况下,TreepathScanner API确实会产生正确的输出,而短缺的原因是TreepathScanner是用于我的用例(确定将要生成的类文件的列表)和该com的错误解决方案。Sun.Source.UTIL.TaskListener,Taskevent和Taskevent.kind和JavafileManager.InferbinaryName应该使用。