`

java compiler API使用

    博客分类:
  • java
阅读更多

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 --JDK6 API 的简介(java动态编译) JavaCompiler 是 Java 中的一个编译器接口,提供了编译 Java 源代码的功能。在 Java SE6 中,JavaCompiler 接口是 javax.tools 包的一部分,提供了标准的方式来...

    通过JavaCompiler进行编译java文件(转载)

    本文将深入探讨如何使用JavaCompiler API来编译Java源文件。 首先,`JavaCompiler`是Java工具包的一部分,它提供了一种标准的方式来编译Java源代码。这个API允许我们在程序中调用JDK的javac编译器,而无需手动启动...

    Flex3 compiler API (En)

    Adobe在2008年发布的《Adobe Flex 3 Compiler API 用户指南》详细介绍了如何使用这一API。 #### 二、核心概念 1. **编译Flex应用**:通过使用Flex3 Compiler API,开发者可以将Flex源代码(通常是.mxml和.as文件)...

    Java编译器API学习1

    然后,我们可以使用Java Compiler API的`JavaCompiler`类来进行编译。`JavaCompiler`是编译任务的调度者,它可以接收一个`Iterable&lt;JavaFileObject&gt;`,这使得我们可以传入我们自定义的`StringSourceJavaFileObject`...

    java compiler没有1.8怎么解决

    通过这些步骤,开发者能够确保他们的代码在Java 1.8环境中得以编译和运行,从而充分利用这个版本提供的特性,如Lambda表达式、Stream API等。在遇到类似问题时,按照这些方法进行排查和调整,通常都能有效解决问题。...

    javaapi和源码-Code-Simulator:一个Java程序,该Java程序使用CompilerAPI导入Java源代码,然后使用Ja

    通过`javax.tools.ToolProvider`类获取编译器实例,再使用`javax.tools.JavaCompiler`类进行源代码的编译。Code-Simulator项目就是利用这一API实现了动态加载和执行Java代码的能力。 2. 源码分析 Code-Simulator...

    使用Java编译器API和类加载器编写Scrapbook程序.pdf

    因此,为了避免这种情况,可以使用JDK 6提供的新功能编译器API(Java Compiler API)和自定义类加载器(Custom Class Loader)来实现一个简单的Scrapbook程序。这种方法可以避免每次编译、编译和运行需要启动两次...

    commons-compiler-3.0.8-API文档-中文版.zip

    标签:codehaus、compiler、commons、janino、jar包、java、中文文档; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明...

    compiler-0.9.3-API文档-中英对照版.zip

    标签:github、java、spullara、compiler、mustache、jar包、java、API文档、中英对照版; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构...

    javacc2_1(Java Compiler Compiler)

    4. **易于使用**:它提供了一套完整的API,使得编写和调试解析器相对简单。 总的来说,Java Compiler Compiler是Java开发者处理解析任务的强大工具,尤其在需要处理自定义语法或解析复杂输入数据的场合,它的价值...

    compiler-0.9.3-API文档-中文版.zip

    包含翻译后的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、中文...

    commons-compiler-3.1.4-API文档-中文版.zip

    标签:codehaus、janino、commons、compiler、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明...

    scala-compiler-2.12.7-API文档-中文版.zip

    标签:scala、lang、compiler、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请...

    commons-compiler-2.7.6-API文档-中文版.zip

    标签:codehaus、compiler、commons、janino、jar包、java、API文档、中文版; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释...

    commons-compiler-3.0.8-API文档-中英对照版.zip

    标签:codehaus、compiler、commons、janino、jar包、java、API文档、中英对照版; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,...

    scala-compiler-2.11.0-API文档-中英对照版.zip

    标签:scala、lang、compiler、jar包、java、API文档、中英对照版; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准...

    plexus-compiler--2.8.4.jar.rar

    开发者可以通过这个API来定义新的编译器或者使用已有的编译器,如Java Compiler(javac)。API包含了编译配置、错误处理和编译结果报告等通用功能,使得不同编译器的实现可以保持一致的调用方式。 2. **plexus-...

    scala-compiler-2.11.8-API文档-中英对照版.zip

    标签:scala、lang、compiler、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,...

    scala-compiler-2.11.0-API文档-中文版.zip

    标签:scala、lang、compiler、jar包、java、中文文档; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请...

    java动态编译指定java文件且将java文件生成jar

    本教程将深入讲解如何实现这个过程,主要关注`java动态编译`和`将class生成jar`这两个关键步骤,同时会涉及到`JavaCompiler` API的使用。 首先,让我们了解`JavaCompiler` API。这是Java标准库中的一部分,位于`...

Global site tag (gtag.js) - Google Analytics