• java compiler API使用


    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


  • 相关阅读:
    给西安市网民的一封信
    西客集推出西安我家的功能了
    西客集又增加新功能了
    为者常成,行者常至
    kvm虚拟机磁盘&文件系统扩容流程
    Git常用命令大全
    Linux下Nexus的部署教程
    sonatype nexus简介(转)
    curl时加参数o或重定向符号>>将结果输出不到文件里怎么办?
    吞吐量(TPS)、QPS、并发数、响应时间(RT)概念
  • 原文地址:https://www.cnblogs.com/secbook/p/2655182.html
Copyright © 2020-2023  润新知