扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
在搞清楚你需要编译什么之前,你需要一个文件管理器. 生成一个管理器基本上需要两步: 创建一个 DiagnosticCollector 和 使用 JavaCompiler 的 getStandardFileManager() 方法获得一个文件管理器. 把 DiagnosticListener 对象传入 getStandardFileManager() 方法中. 这个监听器可以报告一些非致命的问题,到后来你可以选择性的通过把它传入 getTask() 方法来和编译器共享.
DiagnosticCollector diagnostics =
new DiagnosticCollector();
StandardJavaFileManager fileManager =
compiler.getStandardFileManager(diagnostics, aLocale, aCharset);
你也可以往这个调用里传入一个 null 值的诊断器,但这样也就等于用以前的编译器方法了.
在详细查看 StandardJavaFileManager 之前 ,编译过程涉及到 JavaCompiler 的一个方法叫做 getTask(). 它有六个参数,返回一个叫做 CompilationTask 内部类的实例:
JavaCompiler.CompilationTask getTask(
Writer out,
JavaFileManager fileManager,
DiagnosticListener<? super JavaFileObject> diagnosticListener,
Iterable options,
Iterable classes,
Iterable<? extends JavaFileObject> compilationUnits)
缺省情况下,大部分它的参数可以是 null.
* out: System.err
* fileManager: compiler's standard file manager
* diagnosticListener: compiler's default behavior
* options: no command-line options to compiler
* classes: no class names for annotation processing
最后一个参数 compilationUnits 却是不能够为null ,因为它是你要去编译的东西. 它把我们又带回了 StandardJavaFileManager类.注意这个参数类型: Iterable<? extends JavaFileObject>. StandardJavaFileManager 有两个方法返回这样的结果. 你可以使用一个文件对象的List或者 String 对象的List,用它们来表示文件名:
Iterable<? extends JavaFileObject> getJavaFileObjectsFromFiles(
Iterable<? extends File> files)
Iterable<? extends JavaFileObject> getJavaFileObjectsFromStrings(
Iterable names)
并不仅仅 List,实际上,任何一个能够标识需要编译的内容的集合的 Iterable 都可以. List 出现在这里只是因为它容易生成:
String[] filenames = ...;
Iterable<? extends JavaFileObject> compilationUnits =
fileManager.getJavaFileObjectsFromFiles(Arrays.asList(filenames));
现在你有了编译源文件的所有的必要的信息. 从 getTask() 返回的 JavaCompiler.CompilationTask 实现了 Callable.接口 这样,想让任务开始就去调用call()方法.
JavaCompiler.CompilationTask task =
compiler.getTask(null, fileManager, null, null, null, compilationUnits);
Boolean success = task.call();
查看本文来源
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者