如何获取 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.class
和 A$B.class
…
的位置
我正在尝试使用 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
选项
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.class
和 A$B.class
…