`
zjx2388
  • 浏览: 1306925 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

JavaCompiler --JDK6 API的简介

    博客分类:
  • J2EE
阅读更多

public interface JavaCompiler
extends Tool, OptionChecker

从程序中调用 Java™ 编程语言编译器的接口。

编译过程中,编译器可能生成诊断信息(例如,错误消息)。如果提供了诊断侦听器,那么诊断信息将被提供给该侦听器。如果没有提供侦听器,那么除非另行指定,否则诊断信息将被格式化为未指定的格式,并被写入到默认输出 System.err。即使提供了诊断侦听器,某些诊断信息也可能不适合 Diagnostic,并将被写入到默认输出。

编译器工具具有关联的标准文件管理器,此文件管理器是工具本地的(或内置的)。可以通过调用 getStandardFileManager 获取该标准文件管理器。

只要满足下面方法详细描述中的任意附加需求,编译器工具就必须与文件管理器一起运行。如果没有提供文件管理器,则编译器工具将使用标准文件管理器,比如 getStandardFileManager 返回的标准文件管理器。

实现此接口的实例必须符合 Java Language Specification 并遵照 Java Virtual Machine 规范生成类文件。Tool 接口中定义了这些规范的版本。 此外,支持 SourceVersion.RELEASE_6 或更高版本的此接口的实例还必须支持注释处理。

编译器依赖于两种服务:诊断侦听器和文件管理器。虽然此包中的大多数类和接口都定义了编译器(和一般工具)的 API,但最好不要在应用程序中使用接口 DiagnosticListener、JavaFileManager、FileObject 和 JavaFileObject。应该实现这些接口,用于为编译器提供自定义服务,从而定义编译器的 SPI。

此包中有很多类和接口,它们被设计用于简化 SPI 的实现,以自定义编译器行为:

StandardJavaFileManager
    实现此接口的每个编译器都提供一个标准的文件管理器,以便在常规文件上进行操作。StandardJavaFileManager 接口定义了从常规文件创建文件对象的其他方法。

    标准文件管理器有两个用途:

        * 自定义编译器如何读写文件的基本构建块
        * 在多个编译任务之间共享

    重新使用文件管理器可能会减少扫描文件系统和读取 jar 文件的开销。标准文件管理器必须与多个顺序编译共同工作,尽管这样做并不能减少开销,下例是建议的编码模式:

  Files[] files1 = ...; // input for first compilation task
    Files[] files2 = ...; // input for second compilation task

    JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
    StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);

    Iterable<? extends JavaFileObject> compilationUnits1 =
    fileManager.getJavaFileObjectsFromFiles(Arrays.asList(files1));
    compiler.getTask(null, fileManager, null, null, null, compilationUnits1).call();

    Iterable<? extends JavaFileObject> compilationUnits2 =
    fileManager.getJavaFileObjects(files2); // use alternative method
    // reuse the same file manager to allow caching of jar files
    compiler.getTask(null, fileManager, null, null, null, compilationUnits2).call();

    fileManager.close();
 


DiagnosticCollector
    用于将诊断信息收集在一个列表中,例如:

Iterable<? extends JavaFileObject> compilationUnits = ...;
    JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
    DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>();
    StandardJavaFileManager fileManager = compiler.getStandardFileManager(diagnostics, null, null);
    compiler.getTask(null, fileManager, diagnostics, null, null, compilationUnits).call();

    for (Diagnostic diagnostic :diagnostics.getDiagnostics())
    System.out.format("Error on line %d in %d%n",
    diagnostic.getLineNumber()
    diagnostic.getSource().toUri());

    fileManager.close();
 

ForwardingJavaFileManager、ForwardingFileObject 和 ForwardingJavaFileObject
    子类化不可用于重写标准文件管理器的行为,因为标准文件管理器是通过调用编译器上的方法创建的,而不是通过调用构造方法创建的。应该使用转发(或委托)。允许自定义行为时,这些类使得将多个调用转发到给定文件管理器或文件对象变得容易。例如,考虑如何将所有的调用记录到 JavaFileManager.flush():

final Logger logger = ...;
    Iterable<? extends JavaFileObject> compilationUnits = ...;
    JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
    StandardJavaFileManager stdFileManager = compiler.getStandardFileManager(null, null, null);
    JavaFileManager fileManager = new ForwardingJavaFileManager(stdFileManager) {
    public void flush() {
    logger.entering(StandardJavaFileManager.class.getName(), "flush");
    super.flush();
    logger.exiting(StandardJavaFileManager.class.getName(), "flush");
               }
           };
    compiler.getTask(null, fileManager, null, null, null, compilationUnits).call();
 


SimpleJavaFileObject
    此类提供基本文件对象实现,该实现可用作创建文件对象的构建块。例如,下例显示了如何定义表示存储在字符串中的源代码的文件对象:

      /**
    * A file object used to represent source coming from a string.
    */
    public class JavaSourceFromString extends SimpleJavaFileObject {
               /**
    * The source code of this "file".
    */
    final String code;

               /**
    * Constructs a new JavaSourceFromString.
    * @param name the name of the compilation unit represented by this file object
    * @param code the source code for the compilation unit represented by this file object
    */
    JavaSourceFromString(String name, String code) {
    super(URI.create("string:///" + name.replace('.','/') + Kind.SOURCE.extension),
    Kind.SOURCE);
    this.code = code;
               }

    @Override
    public CharSequence getCharContent(boolean ignoreEncodingErrors) {
    return code;
               }
           }
 


从以下版本开始:
    1.6
另请参见:
    DiagnosticListener, Diagnostic, JavaFileManager

嵌套类摘要
static interface     JavaCompiler.CompilationTask
          表示编译任务的 future 的接口。
 
方法摘要
 StandardJavaFileManager     getStandardFileManager(DiagnosticListener<? super JavaFileObject> diagnosticListener, Locale locale, Charset charset)
          为此工具获取一个标准文件管理器实现的新实例。
 JavaCompiler.CompilationTask     getTask(Writer out, JavaFileManager fileManager, DiagnosticListener<? super JavaFileObject> diagnosticListener, Iterable<String> options, Iterable<String> classes, Iterable<? extends JavaFileObject> compilationUnits)
          使用给定组件和参数创建编译任务的 future。

分享到:
评论

相关推荐

    JavaCompiler --JDK6 API的简介(java动态编译)

    java动态编译的几种技术介绍。JavaCompiler --JDK6 API的简介(java动态编译)

    JDK-API-1-6-zzh-CN帮助文档中文版

    Java SE 6包括许多新的特性和改进,包括JDBC 4.0 API,Java Compiler API,Pluggable Annotation Processing API和新的XML和Web服务API等。此外,Java SE 6还包括对桌面应用程序的增强支持,如Swing,Java2D和Java ...

    jdk-9.0.1_doc-all 最新版

    Defines the Java API for XML Processing (JAXP), the Streaming API for XML (StAX), the Simple API for XML (SAX), and the W3C Document Object Model (DOM) API. java.xml.bind Defines the Java ...

    JDK1.6新特性与实战例子

    JDK6的新特性之一:...现在我们可以用JDK6 的Compiler API(JSR 199)去动态编译Java源文件 JDK6的新特性之五:轻量级Http Server JDK6提供了一个简单的Http Server API,据此我们可以构建自己的嵌入式Http Server,

    javacv-platform-1.3.3-src

    To learn how to use the API, since documentation currently lacks, please refer to the Sample Usage section below as well as the sample programs, including two for Android (FacePreview.java and Record...

    elasticsearch-5.2.2客户端JAVA开发需要的69个jar包

    5.1.1.jar,log4j-1.2-api-2.7.jar,log4j-api-2.7.jar,log4j-core-2.7.jar,lucene-analyzers-common-6.4.1.jar,lucene-backward-codecs-6.4.1.jar,lucene-core-6.4.1.jar,lucene-grouping-6.4.1.jar,lucene-...

    compiler-janino-commons

    此代码经过重构,允许 Janino 使用完整的 OpenJDK 7 编译器即时编译和运行 Java 代码片段,而无需安装 JDK 或与已安装的 JDK 发生冲突。 许可和版权来自原始来源。 (c) 2001-2010,Arno Unkrig - BSD

    app_java_compiler:Android APP,用于编辑和运行Java代码

    app_java_compiler Android APP for editing and running Java code. You can download APK from Google Play . 1. screenshot 2. competitor analysis 3. each app details Java N-IDE support jdk 1.7 界面复杂,...

    tomcat-7_API_帮助文档

    compiler from the JDK to compile JSPs, or any other Java compiler supported by Apache Ant. ============== API Stability: ============== The public interfaces for the following classes are fixed and ...

    dubbo、dubbox编译所需jar包

    wagon-provider-api-1.0-alpha-6.jar wagon-provider-api-1.0-beta-2.jar wagon-provider-test-1.0-alpha-5.jar wagon-ssh-1.0-alpha-5.jar wagon-ssh-1.0-beta-2.jar wagon-ssh-common-1.0-beta-2.jar wagon-ssh-...

    tomcat-8_API

    * ecj-4.4.jar (Eclipse JDT Java compiler) * el-api.jar (EL 3.0 API) * jasper.jar (Jasper 2 Compiler and Runtime) * jasper-el.jar (Jasper 2 EL implementation) * jsp-api.jar (JSP 2.3 API) * servlet-api....

    新版Android开发教程.rar

    的 Android SDK 提供了在 Android 平台上使用 JaVa 语言进行 Android 应用开发必须的工具和 API 接口。 特性 • 应用程序框架 支持组件的重用与替换 • Dalvik Dalvik Dalvik Dalvik 虚拟机 专为移动设备优化 • ...

    JDK 6.2.3文文档.rar

    JDK6新特性目录导航: Desktop类和SystemTray类 JAXB2实现对象与XML之间的映射 StAX Compiler API 轻量级 Http Server API 插入式注解处理API(Pluggable Annotation Processing API) 用Console开发控制台程序 对...

    java开发常用jar包

    slf4j-api-1.5.8.jar和slf4j-log4j12-1.5.0.jar hibernate使用的一个日志系统 spring.jar spring核心包 spring-security-core-2.0.4.jar 和 spring-security-taglibs-2.0.4.jar 权限管理 commons-codec-1.3....

    spring-hibernate-dwr实例

    spring-hibernate-dwr做的AJAX操作CRUD实例 环境:myeclipse6.0+jdk1.6 所需lib列表,请自行加入 mysql-connector-java-3.1.7-bin.jar antlr-2.7.6rc1.jar asm-attrs.jar cglib-2.1.3.jar ...

    java7帮助文档

    This release contains Java API for XML Processing (JAXP) 1.4.5, supports Java Architecture for XML Binding (JAXB) 2.2.3, and supports Java API for XML Web Services (JAX-WS) 2.2.4. ...

    DSL语法解析器生成器dropincc.java.zip

    jdk1.6 compiler API动态编译为字节码;自动管理字节码、用户无需关心具体生成的解析器源码;专为DSL打造,相对与使用其它常见工具(javacc, antlr等)做DSL解析,代码量急剧下降;上手较为容易,让用户更加关注自身...

    JAVA6新特性介绍.zip

    jdk1.6新特性 1.Desktop类和SystemTray类 2.使用JAXB2来实现对象与XML之间的映射 ...6.插入式注解处理API(Pluggable Annotation Processing API) 7.用Console开发控制台程序 8.对脚本语言的支持 9.Common Annotations

    maven的优缺点 项目

    &lt;artifactId&gt;maven-compiler-plugin &lt;!-- &lt;version&gt;3.6.1&lt;/version&gt; --&gt; &lt;source&gt;1.7 &lt;target&gt;1.7 &lt;encoding&gt;UTF-8&lt;/encoding&gt; &lt;!-- 将源码打包成JAR包 --&gt; ...

    spring+struts+hibernate+dwr+jstl做的实例

    2.0.rc2.jar jaxen-full.jar jaxp-api.jar jdbc2_0-stdext.jar jstl.jar mail.jar mysql-connector-java-5.0.4-bin.jar sax.jar saxpath.jar standard.jar xalan.jar xercesImpl....

Global site tag (gtag.js) - Google Analytics