java 调用java编译器_调用Java编译器API编译Java

欢迎进入Java社区论坛,与200万技术人员互动交流 >>进入 如果没有编译警告和错误,这个call() 方法会编译所有的 compilationUnits 变量指定的文件,以及有依赖关系的可编译的文件. 想要知道是否所有的都成功了,去查看一下返回的 Boolean 值. 只有当所有的编译

欢迎进入Java社区论坛,与200万技术人员互动交流 >>进入

如果没有编译警告和错误,这个call() 方法会编译所有的 compilationUnits 变量指定的文件,以及有依赖关系的可编译的文件. 想要知道是否所有的都成功了,去查看一下返回的 Boolean 值. 只有当所有的编译单元都执行成功了,这个 call() 方法才返回 Boolean.TRUE . 一旦有任何错误,这个方法就会返回 Boolean.FALSE.

在展示运行这个例子之前,让我们添加最后一个东西,DiagnosticListener, 或者更确切的说,  DiagnosticCollector.的实现类.把这个监听器当作getTask()的第三个参数传递进去,你就可以在编译之后进行一些调式信息的查询了.

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));

}

在最后,你应该调用管理器的close() 方法.

把所有的放在一起,就得到的了下面的程序,让我们重新编译Hello类.

import java.io.*;

import java.util.*;

import javax.tools.*;

public class BigCompile {

public static void main(String args[]) throws IOException {

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

DiagnosticCollector diagnostics =

new DiagnosticCollector();

StandardJavaFileManager fileManager =

compiler.getStandardFileManager(diagnostics, null, null);

Iterable extends JavaFileObject> compilationUnits =

fileManager.getJavaFileObjectsFromStrings(Arrays.asList("Hello.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));

}

fileManager.close();

System.out.println("Success: " + success);

}

}

编译和运行这个程序会输出成功的信息:

> javac BigCompile.java

> java BigCompile

Success: true

然而,如果你把 println 方法改成书写错误的 pritnln 方法,当你运行时你会得到下面的信息:

> java BigCompile

Code: compiler.err.cant.resolve.location

Kind: ERROR

Position: 80

Start Position: 70

End Position: 88

Source: Hello.java

Message:  Hello.java:3: cannot find symbol

symbol  : method pritnln(java.lang.String)

location: class java.io.PrintStream

Success: false

使用Compiler API,你可以实现比在这篇简要的提示介绍的更多的事情. 例如,你可以控制输入输出的目录或者在集成编译器里高亮一些编译错误. 现在,向 Java Compiler API表示感谢,你可以使用标准API了. For more information on the Java Compiler API and JSR 199, see the JSR 199 specification.

[1] [2] [3]

test.jsp?url=http%3A%2F%2Fwww.chinaitlab.com%2Fcms%2Fimages%2Flogo14.gif&refer=http%3A%2F%2Fjava.chinaitlab.com%2Ftools%2F718480_3.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值