当前位置: 首页 > 面试题库 >

如何获取JavaCompiler CompilationTask生成的类文件的列表?

佴淮晨
2023-03-14
问题内容

我正在尝试使用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… 的位置



 类似资料:
  • 我真的很喜欢SPQR使图形ql与现有系统轻松集成的方式,我唯一希望看到的是文件,这样我就可以了解有关图形QL语法的更多信息。 有没有办法从现有的代码中生成集成了SPQR注释的scheme文件? 为了提供一些代码,让我们使用来自GitHub站点的相同代码 实体: 服务等级: 预期产出:

  • 有没有一种方法可以获得一个文件列表,而不需要对一个公共托管的Goolge驱动器文件夹使用授权? 示例文件夹:https://googledrive.com/host/0b1nmfb7vdm6jnnhjwk9cdu9uehc/ 我想使用该文件夹托管我将在其他站点的图库中显示的图像。

  • 问题内容: 因此,我试图使用文件handle.list()方法获取目录中的文件列表,但是即使目录中有文件,它也会返回一个空列表。在我看来,奇怪的是它可以在设备上运行,但不能在桌面上运行。我想我知道问题出在哪里,但是我却不知道如何解决。在方法描述中,它说“在桌面上,类路径上目录的FileType.Internal句柄将返回长度为零的数组。”,但是除此之外没有其他方法,所以你们认为我能做什么? 问题答

  • 嗨,我正在尝试从给定的令牌获取电子邮件用户。我尝试过这样来解析令牌,但根据以下示例,我总是得到空值或值: 我将令牌放在url上,就像这样localhost:8000/admin/user/get_all?token={{token},我还将令牌作为添加到头中注意:我正在使用postman发出请求。但是当我尝试将解析值传递给响应时,我总是得到值: 如果我错了,请纠正我:解析的意思是获取身份验证用户的

  • 问题内容: 我正在编写几个Java程序,在完成我想做的所有事情之后,需要在单独的JVM中终止/清理工作。为此,我将需要获取要创建的Java进程的PID。 问题答案: 在Windows和Unix上均可使用。您可以使用从Java程序中调用此命令。的样本输出如下 您可能需要对此进行解析,然后检查标准名称,然后从相应的行中获取pid。

  • 问题内容: 我正在努力开发一个android应用程序。我需要使用网络服务。我有一个wsdl文件,但我想将其转换为java,以便可以在Java程序中使用其功能。有什么方法可以将wsdl文件转换为Java? 问题答案: 是的,您可以使用: WSDL2Java Eclipse插件 有了这些,您只需提供wsdl,就会自动为您生成Java类的客户端。