java - 如何获取JavaCompiler编译任务生成的类文件列表?

标签 java classloader javacompiler

我正在尝试使用 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 ();

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

最佳答案

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

关于java - 如何获取JavaCompiler编译任务生成的类文件列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39239285/

相关文章:

java - (JavaCompiler) 同时编译多个文件

java - 这个 if 语句会抛出异常还是忽略它?

java - 使用 Spring Boot 的 Hibernate 上的表列映射错误

java - 创建 Class<?> 对象,其中 <?> 定义为 ArrayList<String> 中的字符串 - Java

java - 如何检查应用服务器与WebSphere之间的类冲突?

java - 在每个单元测试开始时重新加载静态变量

java - 如何动态编译和运行资源中带有.class文件的.java文件?

java - KeyListener 不适用于对象

java - 应用于文本规范化链的设计模式

java - 转换后的 java.util.Date 的 ChronoUnit.between()