用java调用编译器编译java文件-马士兵设计模式教程-动态代理 .
2012-07-27 14:31
936 查看
//编译器类只有jdk6里面才有 public class CompilerTest { //window下面的换行是\r\t 回车换行 public static void main(String[] args) throws IOException, ClassNotFoundException, Exception { //得到系统当前的路径,即是java工程的路径(E:\workspace\base) System.out.println(System.getProperty("user.dir")); //在程序里对java文件进行编译,也应该就是动态编译了 writejavaFile(); //得到系统当前的java编译器,也就是javac JavaCompiler javac=ToolProvider.getSystemJavaCompiler(); //不能是jre的运行环境,因为这个是纯净版本,不包含javac等,需要使用jdk才行,否则会是null //先得到一个文件管理对象 //该对象的第一个参数是诊断监听器, StandardJavaFileManager javafile=javac.getStandardFileManager(null, null, null); String filename="D:/JavaTest.java"; //编译单元,可以有多个 Iterable units=javafile.getJavaFileObjects(filename); //编译任务 CompilationTask t=javac.getTask(null, javafile, null, null, null, units); t.call(); javafile.close(); ////把刚才在D:/下生成的class文件JavaTest.class加载进内存并生成实例对象 URL[] urls=new URL[]{new URL("file:/d:/")}; URLClassLoader classload=new URLClassLoader(urls); Class clazz=classload.loadClass("JavaTest"); Method method=clazz.getMethod("main", String[].class); //注意,调用Method类的方法invoke(Object,Object), main方法是类Run的静态方法,调用时是不需要对象实例的。 //Java中通过反射调用其他类中的main方法时要注意的问题 //http://www.cnblogs.com/duancanmeng/archive/2012/04/14/2524614.html method.invoke(clazz.newInstance(),(Object)new String[]{}); } //创建java文件 public static void writejavaFile() throws IOException{ File file=new File("D:/JavaTest.java"); if(!file.exists()){ file.createNewFile(); } FileWriter fw=new FileWriter(file); fw.write(javaClassContent()); fw.close(); } //用字符串连接成一个java类 public static String javaClassContent(){ String rt="\r\n"; String java=new String(); java+="public class JavaTest{"+rt; java+=" public static void main(String[] args){"+rt; java+=" System.out.println(\"hello world\");"+rt; java+=" show();"+rt; java+=" }"+rt; java+=" public static void show(){"+rt; java+=" for(int i=0;i<4;i++){"+rt; java+=" System.out.println(\"i=:\"+i);"+rt; java+=" }"+rt; java+=" }"+rt; java+="}"; return java; } /** * 运行结果: * hello world * i=:0 * i=:1 * i=:2 * i=:3 */ }
本文转自:http://blog.csdn.net/wxwzy738/article/details/7639344
相关文章推荐
- 使用自动生成java文件和自动编译的动态代理模式-马士兵设计模式教程
- 使用自动生成java文件和自动编译的静态代理模式-马士兵设计模式教程
- Java-马士兵设计模式学习笔记-代理模式-动态代理 调用Proxy.newProxyInstance()
- Java-马士兵设计模式学习笔记-观察者模式-读取properties文件,动态增加观察者
- 使用自动生成java文件和自动编译的动态代理模式
- 使用自动生成java文件和自动编译的动态代理模式
- java设计模式-代理模式(静态代理,动态代理)
- 《尚学堂_史上最易懂的设计模式视频》--章节5 动态代理-JDK6自带的编译器
- java 设计模式之动态代理
- [转]转个经典的帖子:说故事学设计模式之-Java动态代理模式
- JAVA设计模式之动态代理
- Java-马士兵设计模式学习笔记-代理模式-动态代理 修改成可以任意修改代理逻辑
- 设计模式_JAVA动态代理设计模式
- -java 动态代理设计模式
- Java设计模式-----Proxy模式(动态代理)
- java设计模式之---动态代理
- 动态代理---动态生成java文件并编译成class文件
- 动态代理---动态生成java文件并编译成class文件
- Java设计模式(四)之动态代理模式
- java与设计模式(五)-jdk动态代理模式