- 浏览: 460478 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (272)
- java基础 (59)
- struts (8)
- spring (8)
- 数据库 (8)
- java 网络编程 (29)
- hibernate (3)
- JavaScript (10)
- 日志管理 (2)
- jsp (4)
- servlet (7)
- xml (4)
- ajax (2)
- web service (4)
- 算法与数据结构 (13)
- java 反射机制 (11)
- java 泛型 (3)
- java I/O (8)
- java 线程 (12)
- JavaEE (6)
- java解惑 (33)
- 工具 (5)
- MyEclipse编程实践 (1)
- OSGI (2)
- 设计模式 (9)
- 正则表达式 (0)
- EJB (3)
- Ubuntu linux (6)
- Android (1)
- web前端 (2)
- 找工作 (1)
- SCA (1)
- maven (1)
- 缓存 (1)
- json (1)
- javamail (1)
- 工作笔记 (2)
最新评论
-
霜花似雪:
博主可以分享一下源码吗?
使用maven构建web项目实例 -
王庆波-行:
很好的demo!
memcache使用实例 -
surpassno:
大写的牛逼
java可视化显示内存使用情况 -
zhulin0504:
怎么访问NetEcho.html页面呀???
applet与servlet的网络通信 -
springdata:
java多线程实例demo源代码下载:http://www.z ...
java多线程例子
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 -d
源码见附件
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(); } } }
源码见附件
- ch17.rar (8.2 KB)
- 下载次数: 4
发表评论
-
java Romdom例子
2011-06-16 16:41 1849random.netInt()如果括号里 ... -
java 内部类详解(转)
2011-06-01 15:47 4934Java 内部类 分四种:成员内部类、局部内部类、静态内部类和 ... -
Fibonacci数列计算+找出出现次数最多字符+不同数字的排列组合
2011-05-26 15:40 20661,斐波拉契数列的计算 package chapter9; ... -
java中的System类中的方法
2011-05-24 11:00 971public final class System exten ... -
java可视化显示内存使用情况
2011-05-20 16:03 2548package memoryManage; /* * ... -
java 界面swing之表格
2011-05-20 13:39 6495package othertest; import ja ... -
java的队列和栈的一些api
2011-05-16 11:31 1669类 Stack<E> java.lang.Obje ... -
JAVA 中一些api(字符字符串缓冲,URL类,Math类方法,正则表达式)
2011-05-12 10:36 1713CharBuffer字符缓冲区, StringBuffer字符 ... -
java applet 一个简单的例子(applet+html)
2011-05-09 16:49 4122java applet是一个类,其层次结构如下图: 类 JAp ... -
java 核心技术(数组(杨辉三角),散列码,对象拷贝,枚举类型,定时器)
2011-05-04 10:43 1525数组java中无多维数组,都是一维数组,多维数组可以看做是数组 ... -
设计模式总结
2011-04-26 16:50 846对于GoF总结的经典的23中设计模式,分为3类: (1)创建型 ... -
猜数字游戏
2011-04-12 17:27 1140package guessNumber; import ... -
Comparator实现排序
2011-04-01 14:13 8620在java.util包中有一个Collections类,里面实 ... -
21天学会java(含电子书下载)
2011-03-15 16:12 250721天学通java 比较基础 第一天 创建简单applicat ... -
理解浮点数存储
2011-03-15 09:44 967整体呈现 二进制浮 ... -
java.lang.UnsatisfiedLinkError解决办法
2011-03-10 16:59 1146实质上就是Eclipse下配置jdk,jre环境的问题 win ... -
java string,stringbuffer区别例子
2011-01-11 14:44 1339public class test_3 { public ... -
java定时器的使用
2011-01-11 09:20 1431有时需要在一定时间段后,执行某一个操作 java中现有的Ti ... -
对象简单克隆clone和引用(转)
2010-12-15 17:02 849对象克隆,返回和原对 ... -
java applet例子---图片像素处理
2010-12-07 17:01 1888package applet; import java. ...
相关推荐
NULL 博文链接:https://hnzhoujunmei.iteye.com/blog/759473
NULL 博文链接:https://hnzhoujunmei.iteye.com/blog/765052
NULL 博文链接:https://hnzhoujunmei.iteye.com/blog/759635
NULL 博文链接:https://hnzhoujunmei.iteye.com/blog/764901
NULL 博文链接:https://hnzhoujunmei.iteye.com/blog/768806
NULL 博文链接:https://hnzhoujunmei.iteye.com/blog/758765
NULL 博文链接:https://hnzhoujunmei.iteye.com/blog/759558
微信开发平台开发工具 JDK jdk 6.0 jdk-6u10-rc2-bin-b32-windows-i586-p-12_sep_2008
java6.0文档chm版,分成三部分,分别为JDK6.0+中文文档-lytim24.part1.rar、JDK6.0+中文文档-lytim24.part2.rar、JDK6.0+中文文档-lytim24.part3.rar
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-...
开发工具 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...
这个是安装开发工具java jdk 有很多用途
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-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-...
jdk-11.0.6_windowsjdk-11.0.6_windowsjdk-11.0.6_windowsjdk-11.0.6_windowsjdk-11.0.6_windowsjdk-11.0.6_windowsjdk-11.0.6_windows
java JDK1.8.60-jdk-8u60-windows-x64,java JDK1.8.60-jdk-8u60-windows-x64,java JDK1.8.60-jdk-8u60-windows-x64
jdk6.0-04.zipjdk6.0-04.zipjdk6.0-04.zipjdk6.0-04.zip
中文版的JDK,能让你更加清楚的知道如何运用API,能更加方便你的查询。
jdk-8u60-windows-i586 jdk-8u60-windows-i586 jdk-8u60-windows-i586 jdk-8u60-windows-i586 jdk-8u60-windows-i586