首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

jdk6.0从入门到精通-chapter17动态编程

2012-09-28 
jdk6.0从入门到精通-----chapter17动态编程jdk6.0引入Compiler API,允许我们在程序中编译源文件。是通过jav

jdk6.0从入门到精通-----chapter17动态编程
jdk6.0引入Compiler API,允许我们在程序中编译源文件。是通过javax.tools包,而jdk5之前都是通过tools.jar中的com.sun.tools.javac包来调用java编译器的。
Compiler API结合反射功能就可以动态的产生java源代码并编译执行,这就有点动态语言的特点了。

下面的程序演示了compiler API的基础应用




执行结果:
java compileAPI.SimpleCompilerAPIDemo
false
对象成功创建

并在当前项目的src目录下生成DynamicObject.java和class文件

高级应用,带参数的编译,如javac -d

package compileAPI;import javax.tools.JavaCompiler;import javax.tools.JavaCompiler.CompilationTask;import javax.tools.StandardJavaFileManager;import javax.tools.ToolProvider;import javax.tools.JavaFileObject;import javax.tools.DiagnosticCollector;import java.io.FileWriter;import java.io.BufferedWriter;import java.io.IOException;import java.util.Arrays;public class AdvancedCompilerAPIDemo{  private static String JAVA_SOURCE_FILE = "DynamicObject.java";  private static String JAVA_CLASS_FILE = "DynamicObject.class";  private static String JAVA_CLASS_NAME = "DynamicObject";  public static void main(String[] args)   {  JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();  DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>();//诊断信息侦听器  StandardJavaFileManager fileManager = compiler.getStandardFileManager(diagnostics, null, null);        //在磁盘上创建类文件    generateJavaClass();    //利用Compiler API编译类文件    try     {    Iterable<? extends JavaFileObject> sourcefiles = fileManager.getJavaFileObjects(JAVA_SOURCE_FILE);    Iterable<String> options = Arrays.asList("-d", ".\"); //编译选项,将编译产生的类文件放在当前目录下    CompilationTask task=compiler.getTask(null, fileManager, diagnostics, options, null, sourcefiles);//启用诊断信息侦听器和编译选项    task.call();    fileManager.close();    Class.forName(JAVA_CLASS_NAME).newInstance();//得到DynamicObject类的实例    }     catch (Exception ex)     {    ex.printStackTrace();    }  }  public static void generateJavaClass()  {  try   {  FileWriter fw = new FileWriter(JAVA_SOURCE_FILE);  BufferedWriter bw = new BufferedWriter(fw);  bw.write("public class "+JAVA_CLASS_NAME+"{");  bw.newLine();  bw.write("public "+JAVA_CLASS_NAME+"(){System.out.println("对象成功创建");}}");  bw.flush();  bw.close();  }     catch (IOException ex)     {    ex.printStackTrace();    }  }}



源码见附件

热点排行