动态生成、编译、运行java文件

动态生成,编译,运行java文件,jdk动态代理底层实现就是利用此方法,demo已上传。 

Java代码   收藏代码
  1. package com.code.test;  
  2.   
  3. import java.io.BufferedReader;  
  4. import java.io.BufferedWriter;  
  5. import java.io.FileNotFoundException;  
  6. import java.io.FileReader;  
  7. import java.io.FileWriter;  
  8. import java.io.IOException;  
  9. import java.net.MalformedURLException;  
  10. import java.net.URL;  
  11. import java.net.URLClassLoader;  
  12.   
  13. import javax.tools.JavaCompiler;  
  14. import javax.tools.JavaCompiler.CompilationTask;  
  15. import javax.tools.JavaFileObject;  
  16. import javax.tools.StandardJavaFileManager;  
  17. import javax.tools.ToolProvider;  
  18.   
  19. public class CodeGenerate {  
  20.   
  21.     /** 
  22.      * 编译java类 
  23.      * @param writerPath 
  24.      */  
  25.     public void javac(String writerPath){  
  26.         //java编译器  
  27.         JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();  
  28.         //文件管理器,参数1:diagnosticListener  监听器,监听编译过程中出现的错误  
  29.         StandardJavaFileManager manager = compiler.getStandardFileManager(nullnullnull);  
  30.         //java文件转换到java对象,可以是多个文件  
  31.         Iterable<? extends JavaFileObject> it = manager.getJavaFileObjects(writerPath);  
  32.         //编译任务,可以编译多个文件  
  33.         CompilationTask t = compiler.getTask(null, manager, nullnullnull, it);  
  34.         //执行任务  
  35.         t.call();  
  36.         try {  
  37.             manager.close();  
  38.         } catch (IOException e) {  
  39.             e.printStackTrace();  
  40.         }  
  41.     }  
  42.       
  43.     /** 
  44.      * 利用反射,实例化对象,此方法可指定class路径,放在classpath下可能会和jdk编译的文件冲突 
  45.      * @param packPath 
  46.      */  
  47.     public void java(String packPath){  
  48.         URL[] urls = null;  
  49.         try {  
  50.             //类路径,url的本地文件格式需要加file:/  
  51.             urls = new URL[] {new URL("file:/"+System.getProperty("user.dir")+"/src/")};  
  52.         } catch (MalformedURLException e) {  
  53.             e.printStackTrace();  
  54.         }  
  55.         //类加载器  
  56.         URLClassLoader url = new URLClassLoader(urls);  
  57.         Class clazz = null;  
  58.         try {  
  59.             //加载到内存  
  60.             clazz = url.loadClass(packPath);  
  61.             //实例化对象  
  62.             clazz.newInstance();  
  63.         } catch (Exception e) {  
  64.             e.printStackTrace();  
  65.         }  
  66.     }  
  67.       
  68.     /** 
  69.      * 读文件 
  70.      * @param readerPath 
  71.      * @return 
  72.      */  
  73.     public BufferedReader fileReader(String readerPath){  
  74.         BufferedReader br = null;  
  75.         try {  
  76.             br = new BufferedReader(new FileReader(readerPath));  
  77.         } catch (FileNotFoundException e) {  
  78.             e.printStackTrace();  
  79.         }  
  80.         return br;  
  81.     }  
  82.       
  83.     /** 
  84.      * 写文件 
  85.      * @param br 
  86.      * @param writerPath 
  87.      */  
  88.     public void fileWriter(BufferedReader br,String writerPath){  
  89.         String line;  
  90.         BufferedWriter bw = null;  
  91.         try {  
  92.             line = br.readLine();  
  93.             bw = new BufferedWriter(new FileWriter(writerPath));  
  94.             while(line != null){  
  95.                 bw.write(line+"\r\n");  
  96.                 line = br.readLine();  
  97.             }  
  98.         } catch (IOException e) {  
  99.             e.printStackTrace();  
  100.         } finally {  
  101.             try {  
  102.                 br.close();  
  103.             } catch (IOException e) {  
  104.                 e.printStackTrace();  
  105.             } finally {  
  106.                 try {  
  107.                     bw.flush();  
  108.                     bw.close();  
  109.                 } catch (IOException e) {  
  110.                     e.printStackTrace();  
  111.                 }  
  112.             }  
  113.         }  
  114.     }  
  115. }  
  116.   
  117. package com.code.test;  
  118.   
  119. import java.io.BufferedReader;  
  120.   
  121. /** 
  122.  * 测试类,注:eclipse设置中  运行环境设置为jdk,如果设置为jre无法编译成功。 
  123.  * @author Administrator 
  124.  * 
  125.  */  
  126. public class CodeTest  {   
  127.       
  128.     //文件读取路径  
  129.     private static final String READER_PATH = System.getProperty("user.dir")+"/codeFile/codeText.txt";  
  130.       
  131.     //文件输出路径  
  132.     private static final String WRITER_PATH = System.getProperty("user.dir")+"/src/com/code/java/CodeText.java";  
  133.       
  134.     //包路径  
  135.     private static final String PACK_PATH = "com.code.java.CodeText";  
  136.       
  137.     public static void main(String[] args) {  
  138.         CodeGenerate code = new CodeGenerate();  
  139.         //读文本文件  
  140.         BufferedReader br = code.fileReader(READER_PATH);     
  141.         //生成java类  
  142.         code.fileWriter(br, WRITER_PATH);                     
  143.         //编译java类  
  144.         code.javac(WRITER_PATH);                              
  145.         //运行java类  
  146.         code.java(PACK_PATH);                                 
  147.     }  
  148. };  
  149.    
  150. package com.code.java;  
  151. /** 
  152.  *  
  153.  * txt文件中的动态类 
  154.  * 
  155.  */  
  156. public class CodeText  {   
  157.       
  158.     public CodeText() {   
  159.         System.out.println("代码生成并且编译运行成功!");  
  160.     }   
  161.       
  162. };  

猜你喜欢

转载自zh-ka-163-com.iteye.com/blog/2230743
今日推荐