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 -dpackage 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(); } }}
源码见附件