java中的CompileAPI入门及使用

2021-04-12 15:31

阅读:493

标签:mpi   list   out   参数   lan   tac   iter   javac   arc   

介绍

java5之前我们可以通过java提供的tools.jar来操作java编译器,java6提供了新的API,让我们可以更方便的调用。包名为javax.tools。

使用

通过文件编译

String filePath = "D:\\Client.java";
//获取java编译器
    JavaCompiler javaCompiler = ToolProvider.getSystemJavaCompiler();
//编译
    int result = javaCompiler.run(null, null, null, filePath);
    System.out.println(result);

结果为0表示编译成功,在相同目录下生成了Client.class文件。
编译参数依次为

  1. java编译器提供参数,如果为null,以System.in代替
  2. 得到Java编译器的输出信息,如果为null,以System.out代替
  3. 接收编译器的错误信息,如果为null,以System.err代替
  4. 一个或多个Java源程式文件

通过非文件格式编译

java还提供了编译其他形式的源文件的功能,如内存字符串文本,数据库读取的文本。

public class JavaFileManagerMain {
  public static void main(String[] args) {
//文件路径
    String fullQuanlifiedFileName = "D:\\Client.java";
//获取编译器
    JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
//获取文件管理器 参数依次为错误监听器,区域对象,编码
    StandardJavaFileManager fileManager =
        compiler.getStandardFileManager(null, null, null);
//通过文件全路径获取要编译的文件对象
    Iterable extends JavaFileObject> files =
        fileManager.getJavaFileObjectsFromStrings(
            Arrays.asList(fullQuanlifiedFileName));
//创建编译任务 参数为错误输出流,文件管理器,错误处理器,编译器选项,参与编译的class,带编译的java文件
    JavaCompiler.CompilationTask task = compiler.getTask(
        null, fileManager, null, null, null, files);
//执行任务
    Boolean result = task.call();
    if (result) {
      System.out.println("Succeeded");
    }
  }
}

接下来实现从内存中读取待编译对象

public class StringObject extends SimpleJavaFileObject {
  private String content = null;

  protected StringObject(String className, String contents) throws URISyntaxException {
    super(new URI(className), Kind.SOURCE);
    this.content = contents;
  }

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

}
public class StringClassCompilerMain {
  public static void main(String[] args) {
    JavaCompiler javaCompiler = ToolProvider.getSystemJavaCompiler();
    StandardJavaFileManager standardJavaFileManager = javaCompiler.getStandardFileManager(null, null, null);
    JavaFileObject testFile = generateTest();
    Iterable extends JavaFileObject> classes = Arrays.asList(testFile);
    JavaCompiler.CompilationTask task = javaCompiler.getTask(null, standardJavaFileManager, null, null, null, classes);
    if (task.call()) {
      System.out.println("success");
    } else {
      System.out.println("failure!");
    }
  }
//通过字符串创建一个待编译对象
  private static JavaFileObject generateTest() {
    String contents = "package com.imooc.sourcecode.java.javacompile.test3;" +
        "class Test {\n" +
        "  public static void main(String[] args) {\n" +
        "    System.out.println(\"success\");\n" +
        "  }\n" +
        "}\n";
    StringObject so = null;
    try {
      so = new StringObject("com.imooc.sourcecode.java.javacompile.test3.Test", contents);
    } catch (URISyntaxException e) {
      e.printStackTrace();
    }
    return so;
  }
}

结果编译成功。

java中的CompileAPI入门及使用

标签:mpi   list   out   参数   lan   tac   iter   javac   arc   

原文地址:https://www.cnblogs.com/strongmore/p/13350587.html


评论


亲,登录后才可以留言!