import java.io.IOException;
import java.util.Arrays;
import javax.tools.Diagnostic;
import javax.tools.DiagnosticCollector;
import javax.tools.JavaCompiler;
import javax.tools.JavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
public class CompilerDemo {
public static void main(String[] args) {
compiler1();
compiler2();
}
/**
* 使用ToolProvider类来获得JavaCompiler接口的一个默认实现。ToolProvider类提供一个getSystemJavaCompiler()方法,返回JavaCompiler接口的一个实例
* 使用JavaCompiler最简单的方法是直接调用run()方法,run()方法是在Tool接口中实现的
*/
public static void compiler1() {
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
int results = compiler.run(null, null, null, "MBeanDemo.java");
System.out.println("Result code: " + results);
}
/**
* 这个方法利用了 StandardJavaFileManager类的优点。这个文件管理器提供了一种方法来完成普通文件的输入输出工作。
* 同时在一个 DiagnosticListener实例的帮助下报告编译的诊断信息。后面将要用到的DiagnosticCollector类只是前面那个 listener的一个实现。
在确定什么东西是需要编译的之前,你需要一个文件管理器。创建一个文件管理器需要两个基本的步骤:
创建一个DiagnosticCollector然后使用getStandardFileManager()方法向JavaCompiler申请文件管理器。
传递 DiagnosticListener实例作为getStandardFileManager()方法的参数。
这个listener报告非致命性的错误,你也可以选择通过将它传递给getTask()方法与编译器共享这个listener
*/
public static void compiler2() {
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>();
StandardJavaFileManager fileManager = compiler.getStandardFileManager(diagnostics, null, null);
Iterable<? extends JavaFileObject> compilationUnits = fileManager.getJavaFileObjectsFromStrings(Arrays.asList("MBeanDemo.java"));
JavaCompiler.CompilationTask task = compiler.getTask(null, fileManager, diagnostics, null, null,
compilationUnits);
Boolean success = task.call();
for (Diagnostic diagnostic : diagnostics.getDiagnostics()) {
System.console().printf("Code: %s%n" + "Kind: %s%n" + "Position: %s%n" + "Start Position: %s%n"
+ "End Position: %s%n" + "Source: %s%n" + "Message: %s%n",
diagnostic.getCode(), diagnostic.getKind(), diagnostic.getPosition(),
diagnostic.getStartPosition(), diagnostic.getEndPosition(), diagnostic.getSource(),
diagnostic.getMessage(null));
}
try {
fileManager.close();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("Success: " + success);
}
}
输出:
Result code: 0
Success: true
分享到:
相关推荐
JavaCompiler --JDK6 API 的简介(java动态编译) JavaCompiler 是 Java 中的一个编译器接口,提供了编译 Java 源代码的功能。在 Java SE6 中,JavaCompiler 接口是 javax.tools 包的一部分,提供了标准的方式来...
本文将深入探讨如何使用JavaCompiler API来编译Java源文件。 首先,`JavaCompiler`是Java工具包的一部分,它提供了一种标准的方式来编译Java源代码。这个API允许我们在程序中调用JDK的javac编译器,而无需手动启动...
Adobe在2008年发布的《Adobe Flex 3 Compiler API 用户指南》详细介绍了如何使用这一API。 #### 二、核心概念 1. **编译Flex应用**:通过使用Flex3 Compiler API,开发者可以将Flex源代码(通常是.mxml和.as文件)...
然后,我们可以使用Java Compiler API的`JavaCompiler`类来进行编译。`JavaCompiler`是编译任务的调度者,它可以接收一个`Iterable<JavaFileObject>`,这使得我们可以传入我们自定义的`StringSourceJavaFileObject`...
通过这些步骤,开发者能够确保他们的代码在Java 1.8环境中得以编译和运行,从而充分利用这个版本提供的特性,如Lambda表达式、Stream API等。在遇到类似问题时,按照这些方法进行排查和调整,通常都能有效解决问题。...
通过`javax.tools.ToolProvider`类获取编译器实例,再使用`javax.tools.JavaCompiler`类进行源代码的编译。Code-Simulator项目就是利用这一API实现了动态加载和执行Java代码的能力。 2. 源码分析 Code-Simulator...
因此,为了避免这种情况,可以使用JDK 6提供的新功能编译器API(Java Compiler API)和自定义类加载器(Custom Class Loader)来实现一个简单的Scrapbook程序。这种方法可以避免每次编译、编译和运行需要启动两次...
标签:codehaus、compiler、commons、janino、jar包、java、中文文档; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明...
标签:github、java、spullara、compiler、mustache、jar包、java、API文档、中英对照版; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构...
4. **易于使用**:它提供了一套完整的API,使得编写和调试解析器相对简单。 总的来说,Java Compiler Compiler是Java开发者处理解析任务的强大工具,尤其在需要处理自定义语法或解析复杂输入数据的场合,它的价值...
包含翻译后的API文档:compiler-0.9.3-javadoc-API文档-中文(简体)版.zip; Maven坐标:com.github.spullara.mustache.java:compiler:0.9.3; 标签:github、java、spullara、compiler、mustache、jar包、java、中文...
标签:codehaus、janino、commons、compiler、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明...
标签:scala、lang、compiler、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请...
标签:codehaus、compiler、commons、janino、jar包、java、API文档、中文版; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释...
标签:codehaus、compiler、commons、janino、jar包、java、API文档、中英对照版; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,...
标签:scala、lang、compiler、jar包、java、API文档、中英对照版; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准...
开发者可以通过这个API来定义新的编译器或者使用已有的编译器,如Java Compiler(javac)。API包含了编译配置、错误处理和编译结果报告等通用功能,使得不同编译器的实现可以保持一致的调用方式。 2. **plexus-...
标签:scala、lang、compiler、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,...
标签:scala、lang、compiler、jar包、java、中文文档; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请...
本教程将深入讲解如何实现这个过程,主要关注`java动态编译`和`将class生成jar`这两个关键步骤,同时会涉及到`JavaCompiler` API的使用。 首先,让我们了解`JavaCompiler` API。这是Java标准库中的一部分,位于`...