JDK6新特性之Compiler

来源:互联网 发布:尿液发红什么原因知乎 编辑:程序博客网 时间:2024/04/29 15:12
浏览了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;
 
publicclass Compiler {
    publicstaticvoid 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,有比较详尽的描述:
https://openjdk.dev.java.net/compiler/guide/compilerAPI.html
http://java.sun.com/javase/6/docs/api/javax/tools/ToolProvider.html
原创粉丝点击