如何获取 JavaCompiler compilationTask 生成的 class 文件列表?

How to get list of class files generated by JavaCompiler compilationTask?

我正在尝试使用 javaCompiler 动态编译 java 代码。代码适用于 gr8,但我需要获取由 CompilationTask 创建的 class 文件的列表。这是源代码:

    JavaCompiler compiler = ToolProvider.getSystemJavaCompiler ();
    DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>();
    StandardJavaFileManager fileManager = compiler.getStandardFileManager (diagnostics,null,null);
    //compile unit
    Iterable<? extends JavaFileObject> compilationUnits =fileManager.getJavaFileObjectsFromFiles (sourceFileList);
    CompilationTask task = compiler.getTask (null,fileManager, diagnostics, null, null, compilationUnits);
    task.call ();

如何获取上述代码生成的 classes 列表,包括内部 classed。任何帮助将不胜感激。

javax.tools.JavaCompiler#getTask() 方法采用允许设置编译器选项的选项参数。使用 -d 选项

设置 class 文件的目标目录
List<String> options = new ArrayList<String>();
// Sets the destination directory for class files
options.addAll(Arrays.asList("-d","/home/myclasses"));

CompilationTask task = compiler.getTask (null,fileManager, diagnostics, options, null, compilationUnits);

现在获取所有具有 .class 扩展名的文件

您提供给任务的文件管理器负责将抽象 JavaFileObject 映射到物理文件,因此它不仅 知道 哪些资源是访问或创建,它甚至 控制 将使用哪个物理资源。当然,处理后只定位创建的资源也是可以的。这是一个简单的独立示例:

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fileManager = compiler.getStandardFileManager(null,null,null);
Path tmp=Files.createTempDirectory("compile-test-");
fileManager.setLocation(StandardLocation.CLASS_OUTPUT,Collections.singleton(tmp.toFile()));
Path src=tmp.resolve("A.java");
Files.write(src, Arrays.asList(
        "package test;",
        "class A {",
        "    class B {",
        "    }",
        "}"
));
CompilationTask task = compiler.getTask(null, fileManager,
        null, null, null, fileManager.getJavaFileObjects(src.toFile()));
if(task.call()) {
    for(JavaFileObject jfo: fileManager.list(StandardLocation.CLASS_OUTPUT,
                            "", Collections.singleton(JavaFileObject.Kind.CLASS), true)) {
        System.out.println(jfo.getName());
    }
}

它将列出生成的 A.classA$B.class

的位置