`

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

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

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


package compileAPI;

import javax.tools.JavaCompiler;
import javax.tools.JavaCompiler.CompilationTask;
import javax.tools.JavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;


import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

public class SimpleCompilerAPIDemo {
	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(); //编译器

System.out.println(compiler==null);      //true直接在Eclipse中执行,必须在命令行中执行,才能保证compiler不为空		StandardJavaFileManager fileManager = compiler.getStandardFileManager(
				null, null, null); //文件管理器

		// 在磁盘上创建类文件
		generateJavaClass();

		// 利用Compiler API编译类文件
		try {
			Iterable<? extends JavaFileObject> sourcefiles = fileManager
					.getJavaFileObjects(JAVA_SOURCE_FILE); //获取待编译的JavaFileObject对象集合
			CompilationTask task = compiler.getTask(null, fileManager, null,
					null, null, sourcefiles); //getTask()是API的核心方法
			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();
		}

	}

}


执行结果:
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();
    }
  }
}



源码见附件
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics