浏览了
JDK6
的新特性
,
感觉
Compiler API
的应用有很大空间
,
它提供对代码的编译功能也就意味着在运行时可以实现代码编辑
,
编译及加载运行
.
可以在系统运行中动态配置和扩展用户自定义的功能
,
甚至可以把
Java
语句作为脚本内嵌到原有系统中扩充功能集
.
下面是我参阅
Jdk6 API Document
测试
Compiler
的例子
.
开发环境
:Window XP+JDK1.6+Eclipse3.2
-
Step1: 创建一个 Java 项目 Test
一定要确认
JRE
的配置
,
进入
Configure JREs...
如下图:
如果
JDK
不是来源于
JDK
下的
Jre
会引发
ToolProvider
获取不到
compiler.
在缺省状态,
Eclipse
会搜索到
Jre1.6..0
安装目录下的
Jre.
此目录下不包含
Compiler
工具
Javac,
需要下载安装
JDK1.6.
- Step2:准备好待编译文件Hello.java和测试代码Compiler.java.
创建目录C:/Java/SWT/src/com/gotop/study,编写Hello.java,代码没有限制,可自行编写一个:
//Hello.java
package com.gotop.study;
import java.util.Date;
public class Hello
{
public String getHelloWorld()
{
return "现在的时间为:"+new Date();
}
}
//Compiler.java
package
com.gotop.study.swt;
import
java.io.File;
import
javax.tools.JavaCompiler;
import
javax.tools.StandardJavaFileManager;
import
javax.tools.ToolProvider;
public
class
Compiler {
public
static
void
main(String args[]) {
try
{
JavaCompiler jc = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager sjfm = jc.getStandardFileManager(
null
,
null
,
null
);
File javaFile =
new
File(
"c:/java/swt/src/com/gotop/study/Hello.java"
);
Iterable fileObjects = sjfm.getJavaFileObjects(javaFile);
jc.getTask(
null
, sjfm,
null
,
null
,
null
, fileObjects).call();
// Add more compilation tasks
sjfm.close();
}
catch
(Exception e) {
e.printStackTrace();
}
}
}
运行即可,在目录C:/Java/SWT/src/com/gotop/study/下你发现:Hello.class表示Compiler run OK.
如果出现以下异常:
java.lang.NullPointerException
at com.gotop.study.swt.Compiler.main(
Compiler.java:14
)
说明你的
JRE
设置有问题
.
关于Compiler的使用,如设置编译参数等可以参考以下Link,有比较详尽的描述:
http://java.sun.com/javase/6/docs/api/javax/tools/ToolProvider.html