`

JDK6.0的新特性一:使用Compiler API

阅读更多

现在我们可以用JDK6 的Compiler API(JSR 199)去动态编译Java源文件,Compiler API结合反射功能就可以实现动态的产生Java代码并编译执行这些代码,有点动态语言的特征。这个特性对于某些需要用到动态编译的应用程序相当有用, 比如JSP Web Server,当我们手动修改JSP后,是不希望需要重启Web Server才可以看到效果的,这时候我们就可以用Compiler API来实现动态编译JSP文件,当然,现在的JSP Web Server也是支持JSP热部署的,现在的JSP Web Server通过在运行期间通过Runtime.exec或ProcessBuilder来调用javac来编译代码,这种方式需要我们产生另一个进程去做编译工作,不够优雅而且容易使代码依赖与特定的操作系统;Compiler API通过一套易用的标准的API提供了更加丰富的方式去做动态编译,而且是跨平台的。 下面代码演示了Compiler API的使用:

public class CompilerAPITester {
 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();
  StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
  generateJavaClass();
  try {
   //将产生的类文件拷贝到程序的ClassPath下面,下面这一行代码是特定于Windows+IntelliJ IDEA 6.0项目,不具有移植性
   Runtime.getRuntime().exec("cmd /c copy "+JAVA_CLASS_FILE+" classes\\production\\JDK6Features");
   Iterable<? extends JavaFileObject> sourcefiles = fileManager.getJavaFileObjects(JAVA_SOURCE_FILE);
   compiler.getTask(null, fileManager, null, null, null, sourcefiles).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(\"In the constructor of DynamicObject\");}}");
   bw.flush();
   bw.close();
  } catch (IOException ex) {
   ex.printStackTrace();
  }
 }
}


  程序运行后,会产生DynamicObject.java和DynamicObject.class两个文件,并在控制台输出:

  In the constructor of DynamicObject

分享到:
评论

相关推荐

    JDK+6.0+ZH+API.chm.zip

    JDK6的新特性之四_使用Compiler API JDK6的新特性之五_轻量级HttpServer JDK6的新特性之七_用Console开发控制台程序 JDK6的新特性之八_嵌入式数据库Derby JDK6的新特性之六_插入式注解处理API JDK6的新特性...

    JDK6.0 中文文档

    这个版本在Java的历史上扮演了重要角色,引入了许多新特性和改进,旨在提高开发者的生产力和应用程序的性能。 JDK 6.0 中的一些核心特性包括: 1. **增强的编译器(Java Compiler, javac)**:JDK 6.0的javac...

    JDK-6.0.180.7

    它引入了许多新特性、增强功能以及对现有特性的优化,旨在提高开发者的效率和提升应用程序的性能。以下是一些关键特性: 1. **泛型**:Java 6引入了泛型,允许在类、接口和方法中使用类型参数,提高了代码的类型...

    JDK1.6的九大新特性

    ### JDK1.6的九大新特性详解 #### 一、Overview JDK1.6(Java Development Kit 1.6)作为Java平台的一个重要版本,引入了许多新的特性和改进,这些变化不仅增强了Java语言本身的实用性,还提高了开发者的生产力。...

    myeclipse低版本支持jdk1.8

    例如,早期版本可能仅支持到Java 1.6或1.7,而Java 1.8引入了诸如lambda表达式、Stream API等新特性,因此需要额外的插件或更新才能在低版本的MyEclipse中使用。 - **Eclipse与MyEclipse的区别**:Eclipse是开源的...

    JDK_API_1_6_zh_CN.rar_JAVA6.0 API_

    这份文档以中文呈现,方便中国开发者理解和使用Java 6.0的特性。 Java SE 6.0,又称为Java Development Kit (JDK) 1.6,是Java平台的核心组件,提供了开发和运行基于Java语言的应用程序所需的基础工具和服务。此...

    JDK1.6安装及与JDK-1.5版本共存

    - 同时,在“Java Compiler”选项卡中启用项目特定设置,并根据需要选择编译版本为5.0或6.0。 #### 五、注意事项 1. **环境变量设置**: - 在多版本共存的情况下,需要正确配置系统环境变量,特别是`JAVA_HOME`...

    java6.0源码-Laba14:新的

    Java 6.0,作为Java平台的重要版本,引入了一系列的新特性和性能优化,为开发者提供了更强大的工具和更好的性能体验。在Laba14的源码中,我们可以深入探讨这些关键改进,了解它们如何影响实际开发和应用程序的运行...

    JDK 1.7 免安装版

    JDK 1.7,也被称为Java 7,是Java平台的一个重要版本,它引入了许多新特性和改进,以提升开发者的工作效率和程序性能。免安装版,或绿色版,是指无需通过传统的安装过程,只需解压缩文件即可使用的软件版本,这使得...

    编译tomcat6所需的jar包

    在IT行业中,Tomcat是一款广泛使用的开源Java应用服务器,特别是对于Servlet和JSP的应用部署。当我们需要对Tomcat进行自定义编译或者扩展其功能时,了解如何获取和使用必要的jar包是至关重要的。本篇将详细介绍...

    Windows下Android开发环境搭建指南

    确保Eclipse使用正确的JDK版本进行编译,通过【Window】&gt;【Preferences…】打开属性设置窗口,选择【Java】&gt;【Compiler】面板,设置Java编译器为JDK 6.0版本。 #### 六、创建Android项目 完成上述步骤后,即可在...

    Windows上建立AndRoid开发环境.pdf

    - 创建一个新的Android项目: - 选择“File” &gt; “New” &gt; “Project”。 - 选择“Android” &gt; “Android Project”,点击“Next”。 - 输入项目名称、包名等信息。 - 点击“Finish”。 - 设置启动配置: - ...

    java7帮助文档

    The directory &lt;Java home&gt;/demo/jfc/Font2DTest/ contains samples that demonstrate Java support for Unicode 6.0. Java SE 7 can accommodate new currencies that are identified by their ISO 4217 codes; ...

    spring-hibernate-dwr实例

    spring-hibernate-dwr做的AJAX操作CRUD实例 环境:myeclipse6.0+jdk1.6 所需lib列表,请自行加入 mysql-connector-java-3.1.7-bin.jar antlr-2.7.6rc1.jar asm-attrs.jar cglib-2.1.3.jar ...

    spring+struts+hibernate+dwr+jstl做的实例

    完全由Spring接管DWR AJAX处理(不需要配置dwr.xml)等技术点 源码在/mytest/WEB-INF/src下 Winxp sp3+JDK1.6+Tomcat 6.0下运行通过 因文件长度限制,未加入相关类库,请自行加入,需要的类库有: dom.jar...

Global site tag (gtag.js) - Google Analytics