Java动态编译类小案例

动态生成类小案例,调用JDK自身的编译工具api,比较有用。

 

  
  
  
  
  1. package com.lzz.proxy.compiler;  
  2.  
  3. import java.io.File;  
  4. import java.io.FileWriter;  
  5. import java.io.IOException;  
  6.  
  7. import javax.tools.JavaCompiler;  
  8. import javax.tools.JavaCompiler.CompilationTask;  
  9. import javax.tools.StandardJavaFileManager;  
  10. import javax.tools.ToolProvider;  
  11. /**  
  12.  * 动态生成类以及编译,JDK版本必须要在1.6,或者1.6以上  
  13.  * @author Administrator  
  14.  *  
  15.  */ 
  16. public class Compiler {  
  17.     //回车加换行符  
  18.     static String rt="\r\n";     
  19.     //生成类的源文件,写成字符串的形式  
  20.     static String src=\'#\'" /span>
  21.             "package com.lzz.proxy;"+rt+  
  22.             "public class TankLogProxy implements Moveable {"+rt+  
  23.             "    Moveable t;"+rt+  
  24.             "    public TankLogProxy(Moveable t) {"+rt+  
  25.             "        this.t=t;"+rt+  
  26.             "    }"+rt+  
  27.             "@Override"+rt+  
  28.             "    public void move() {"+rt+  
  29.             "    System.out.println(\"log: start move....... \");"+rt+  
  30.             "    t.move();"+rt+  
  31.             "    System.out.println(\"log: end move......\");"+rt+  
  32.             "   }"+rt+  
  33.             "}";  
  34.     public static void main(String[] args) throws Exception {  
  35.         //写文件,目录可以自己定义  
  36.         String filename=System.getProperty("user.dir")+"/src/com/lzz/proxy/TankLogProxy.java";  
  37.         System.out.println(filename);  
  38.         File file =new File(filename);  
  39.         FileWriter fw=new FileWriter(file);  
  40.         fw.write(src);  
  41.         fw.flush();  
  42.         fw.close();  
  43.         //编译文件,调用jdk本身的工具  
  44.         JavaCompiler compiler=ToolProvider.getSystemJavaCompiler();  
  45.         System.out.println(compiler.getClass().getName());  
  46.     /*  compiler.getStandardFileManager(null, null, null);三个参数  
  47.         第一个 用来监听编译异常错误等   
  48.         第二个,第三个 用来设置语言和编码,这里使用默认就行了*/ 
  49.         StandardJavaFileManager sjfm=compiler.getStandardFileManager(nullnullnull);  
  50.         Iterable units=sjfm.getJavaFileObjects(filename);  
  51.         CompilationTask ct=compiler.getTask(null, sjfm, nullnullnull, units);  
  52.         ct.call();  
  53.         sjfm.close();  
  54.     }  
  55. }  

 

你可能感兴趣的:(java,api,工具,动态)