java compile_java中的CompileAPI入门及使用

介绍

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文件。

编译参数依次为

java编译器提供参数,如果为null,以System.in代替

得到Java编译器的输出信息,如果为null,以System.out代替

接收编译器的错误信息,如果为null,以System.err代替

一个或多个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;

}

}

结果编译成功。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值