`

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



源码见附件
分享到:
评论

相关推荐

    jdk6.0从入门到精通-----chapter18与动态语言结合

    标题中的“jdk6.0从入门到精通-----chapter18与动态语言结合”指的是Java开发工具包(JDK)6.0版本中的一个章节,主要探讨了如何将Java与动态编程语言集成。在Java 6中,引入了一个重要的特性,即Java平台标准版6...

    jdk6.0从入门到精通-----chapter5网络编程 新I/O(含源码下载)

    在Java编程领域,JDK(Java Development Kit)是开发和运行Java应用程序的...总的来说,"JDK6.0从入门到精通-----chapter5网络编程 新I/O"是一个极好的学习资源,无论你是初学者还是有经验的开发者,都能从中获益良多。

    jdk6.0从入门到精通-----chapter7线程

    《JDK 6.0线程入门到精通——Chapter 7》 在Java开发中,线程是程序执行的最小单元,它使得一个程序能够同时处理多个任务,从而提高了程序的效率和响应性。在JDK 6.0中,线程的管理和使用有了更加完善的特性,对于...

    (源码下载)jdk6.0从入门到精通-----chapter2--输入输出,克隆对象

    标题 "(源码下载)jdk6.0从入门到精通-----chapter2--输入输出,克隆对象" 提供了我们要探讨的主题,即Java中的输入输出流(I/O Stream)和对象克隆。在这个章节中,我们将深入理解这两个关键概念。 **输入输出流...

    jdk6.0从入门到精通-----chapter8并发多线程(1)(源码下载)

    本章“jdk6.0从入门到精通-----chapter8并发多线程(1)”着重讲解了Java 6中关于多线程的基本知识和实践技巧。通过源码下载,读者可以更直观地理解多线程的实现方式。 首先,我们要理解什么是多线程。在单线程环境...

    jdk6.0从入门到精通-----chapter4--文件目录操作

    在Java编程语言中,JDK(Java Development Kit)是核心组件,它包含了开发和运行Java应用程序所需的工具和Java运行环境。本章节将深入探讨JDK 6.0中的文件和目录操作,这对于任何Java开发者来说都是必备的知识点。在...

    jdk6.0从入门到精通-----chapter16反射机制-spring AOP

    在Java编程领域,JDK6.0是一个重要的版本,它为开发者提供了丰富的特性和改进。本章我们将深入探讨“反射机制”以及如何结合Spring AOP(面向切面编程)进行应用。反射是Java中的一种强大工具,允许程序在运行时检查...

    jdk 6.0 jdk-6u10-rc2-bin-b32-windows-i586-p-12_sep_2008(微信开发平台开发JDK)

    微信开发平台开发工具 JDK jdk 6.0 jdk-6u10-rc2-bin-b32-windows-i586-p-12_sep_2008

    jdk-7u80-windows-x64安装包

    jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-...

    官方JDK6.0中文版

    - **增强的动态代理:** JDK 6.0引入了改进的动态代理机制,允许开发者创建能够处理多个接口的代理类,提高了代码的灵活性和可维护性。 - **Swing组件的增强:** Swing库在JDK 6.0中得到了加强,包括新的布局管理器...

    JDK6.0+中文文档-lytim24.part1.rar

    java6.0文档chm版,分成三部分,分别为JDK6.0+中文文档-lytim24.part1.rar、JDK6.0+中文文档-lytim24.part2.rar、JDK6.0+中文文档-lytim24.part3.rar

    开发工具 jdk-8u121-windows-i586

    开发工具 jdk-8u121-windows-i586开发工具 jdk-8u121-windows-i586开发工具 jdk-8u121-windows-i586开发工具 jdk-8u121-windows-i586开发工具 jdk-8u121-windows-i586开发工具 jdk-8u121-windows-i586开发工具 jdk-8...

    JDK6.0u10b32-windows-

    这个是安装开发工具java jdk 有很多用途

    java-jdk1.8-8u361-all-jdk-win-linux

    java-jdk1.8-8u361-all-jdk-win-linux 该压缩包中包含jdk1.8-8u361下windows版本和linux版本,其包含快速安装包和对应的jdk压缩包版本,具体内容如下: jdk-8u361-linux-aarch64.rpm jdk-8u361-linux-i586.rpm jdk-8...

    jdk-8u131-windows-x64

    jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-...

    jdk1.8 jdk-8u5-windows-i586 32位官方正式版

    jdk1.8 jdk-8u5-windows-i586 32位官方正式版 jdk1.8 jdk-8u5-windows-i586 32位官方正式版

    jdk-8u60-windows-i586-JDK1.8-32位

    jdk-8u60-windows-i586 jdk-8u60-windows-i586 jdk-8u60-windows-i586 jdk-8u60-windows-i586 jdk-8u60-windows-i586

    jdk-8u311-windows-x64.exe

    jdk-8u311-windows-x64.exe jdk-8u311-windows-x64.exe.zip jdk-8u311-windows-x64.exe jdk-8u311-windows-x64.exe.zip jdk-8u311-windows-x64.exe jdk-8u311-windows-x64.exe.zip jdk-8u311-windows-x64.exe jdk-8u...

    JDK 6.0.zip

    安装JDK 6.0后,你需要设置环境变量`JAVA_HOME`指向JDK的安装路径,同时将bin目录添加到系统PATH变量中,以便在任何地方都能运行Java命令。然后,你可以开始编写、编译和运行Java程序,享受JDK 6.0带来的便利和强大...

Global site tag (gtag.js) - Google Analytics