gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:49:12 28 4
gpt4 key购买 nike

我正在尝试使用 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com