1

因为单个 Java 文件可以编译成任意数量的类文件,编译器 API 有没有办法找出生成了哪些类文件?它正在输出到一个可能包含其他文件的目录,所以我不能只看那个。

4

3 回答 3

3

我想出了一些似乎可行的方法。*FileManager 有回调来获取事物的位置,包括用于输出的事物。您可以使用 ForwardingJavaFileManager 包装它,覆盖并存储来自调用的值。

final List<String> classFiles = new ArrayList<>();
StandardJavaFileManager inner = compiler.getStandardFileManager(null, null, null);
JavaFileManager fileManager = new ForwardingJavaFileManager(inner) {
    @Override
    public JavaFileObject getJavaFileForOutput(Location location, String className,
                JavaFileObject.Kind kind, FileObject sibling) throws IOException {
        JavaFileObject o = super.getJavaFileForOutput(location, className, kind, sibling);
        classFiles.add(o.getName());
        return o;
    }
};
于 2012-10-12T21:26:18.887 回答
0

javax.tools包显示了管理编译单元的几种方法。

请参阅JavaFileObjectJavaFileManager

于 2012-10-12T18:33:30.777 回答
0

我不认为我们可以使用任何给定的引用找到由 Java Compiler API 创建的非公共类。您需要对输入的 java 文件进行解析(或应用 reg 表达式)以识别可用的类名。获得类的名称后,您应该能够使用自定义类加载器来加载它们。

萨西什

于 2012-10-12T18:51:50.823 回答