2

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

    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 ();

如何获取上述代码生成的类列表,包括内部类。任何帮助将非常感激。

4

2 回答 2

3

您提供给任务的文件管理器负责将抽象映射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...</p>

于 2016-08-31T16:59:23.663 回答
0

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

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扩展名的文件

于 2016-08-31T01:37:11.933 回答