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();
}
}
}



源码见附件
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值