成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

JDK 6動態編譯—內存字符串編譯方式

開發 后端
JDK6開始提供了動態編譯的API,在許多應用場景都可以用得著,如動態加載(修改)服務、高性動態業務邏輯實現(用腳本或模板引擎實現效率滿足不了需求)等都非常好用。

 

JDK6開始提供了動態編譯的API,在許多應用場景都可以用得著,如動態加載(修改)服務、高性動態業務邏輯實現(用腳本或模板引擎實現效率滿足不了需求)等都非常好用。

    API對應的接口都在javax.tools包下面,常用編譯方式有基于文本文件、內存字符串等,實際上基于URI的字節流都可以,也就是遠程Java源代碼也可以。對于常用的已有文件形式的動態編譯網上的實例已經非常多,我在這里介紹下動態編譯內存中以字符串的形式。

簡單的代碼流程如下:

Java代碼
  1. //通過系統工具提供者獲得動態編譯器     
  2. JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();     
  3. //獲得一個文件管理器,它的功能主要是提供所有文件操作的規則,     
  4. //如源代碼路徑、編譯的classpath,class文件目標目錄等,其相關屬性都提供默認值     
  5. StandardJavaFileManager fileManager = compiler.getStandardFileManager(nullnullnull);     
  6.     
  7. //獲得CompilationTask并調用     
  8. //獲得CompilationTask方法原型:     
  9. getTask(Writer out,     
  10.      JavaFileManager fileManager,     
  11.      DiagnosticListenersuper JavaFileObject> diagnosticListener,     
  12.      Iterable options,     
  13.      Iterable classes,     
  14.      Iterableextends JavaFileObject> compilationUnits)     
  15.     
  16.     
  17. //簡單調用例子     
  18. boolean b = jc.getTask(null, fileManager, nullnullnull, compilationUnits).call();  

    我這里介紹的字符串形式的編譯(其它方式也會有相似的具體實現),還需要提供一個FileObject一個實現類,將相應的對象封裝作為getTask()的最后一個參數來構建具體的編譯Task.

JavaDoc提供的一個FileObject參考實現:

Class JavaSourceFromString

Java代碼
  1. import java.net.URI;     
  2.     
  3. import javax.tools.SimpleJavaFileObject;     
  4.     
  5. public class JavaSourceFromString extends SimpleJavaFileObject {     
  6.     
  7.     /**    
  8.      *  源碼    
  9.      */    
  10.     final String code;     
  11.     
  12.     /**    
  13.      * 構造方法:從字符串中構造一個FileObject    
  14.      * @param name the name of the compilation unit represented by this file object    
  15.      * @param code the source code for the compilation unit represented by this file object    
  16.      */    
  17.     JavaSourceFromString(String name, String code) {     
  18.         super(URI.create("string:///" + name.replace('.','/') + Kind.SOURCE.extension),     
  19.               Kind.SOURCE);     
  20.         this.code = code;     
  21.     }     
  22.     
  23.     @Override    
  24.     public CharSequence getCharContent(boolean ignoreEncodingErrors) {     
  25.         return code;     
  26.     }     
  27. }    



完整的測試類:
Class TestDyCompile

Java代碼
  1. import java.io.File;     
  2. import java.io.IOException;     
  3. import java.util.Arrays;     
  4.     
  5. import javax.tools.JavaCompiler;     
  6. import javax.tools.JavaFileManager.Location;     
  7. import javax.tools.JavaFileObject;     
  8. import javax.tools.StandardJavaFileManager;     
  9. import javax.tools.StandardLocation;     
  10. import javax.tools.ToolProvider;     
  11.     
  12. import dyclass.Test;     
  13.     
  14.     
  15. public class TestDyCompile {     
  16.     
  17.     /**    
  18.      *     
  19.      * @author ZhangXiang    
  20.      * @param args    
  21.      * 2011-4-7    
  22.      */    
  23.     public static void main(String[] args) {     
  24.              
  25.         StringBuilder classStr = new StringBuilder("package dyclass;public class Foo implements Test{");     
  26.         classStr.append("public void test(){");     
  27.         classStr.append("System.out.println(\"Foo2\");}}");     
  28.              
  29.         JavaCompiler jc = ToolProvider.getSystemJavaCompiler();     
  30.         StandardJavaFileManager fileManager = jc.getStandardFileManager(nullnullnull);     
  31.         Location location = StandardLocation.CLASS_OUTPUT;     
  32.         File[] outputs = new File[]{new File("bin/")};     
  33.         try {     
  34.             fileManager.setLocation(location, Arrays.asList(outputs));     
  35.         } catch (IOException e) {     
  36.             e.printStackTrace();     
  37.         }     
  38.              
  39.         JavaFileObject jfo = new JavaSourceFromString("dyclass.Foo", classStr.toString());     
  40.         JavaFileObject[] jfos = new JavaFileObject[]{jfo};     
  41.         Iterableextends JavaFileObject> compilationUnits = Arrays.asList(jfos);     
  42.         boolean b = jc.getTask(null, fileManager, nullnullnull, compilationUnits).call();     
  43.         if(b){//如果編譯成功     
  44.             try {     
  45.                 Test t = (Test) Class.forName("dyclass.Foo").newInstance();     
  46.                 t.test();     
  47.             } catch (InstantiationException e) {     
  48.                 e.printStackTrace();     
  49.             } catch (IllegalAccessException e) {     
  50.                 e.printStackTrace();     
  51.             } catch (ClassNotFoundException e) {     
  52.                 e.printStackTrace();     
  53.             }     
  54.         }     
  55.     }     
  56. }   



我在這里的具體業務類為dyclass.Foo,也就是我們需要動態編譯的類,為了方便寫業務的調用代碼,也可以讓我們的業務類實現一個接口,然后通過反射獲得具體子類強制轉換來調用。

Test接口:

Java代碼
  1. public interface Test {     
  2.     //業務方法簽名     
  3.     void test();     
  4. }   


另外,在代碼中還有這么一段:

Java代碼
  1.   Location location = StandardLocation.CLASS_OUTPUT;     
  2.          File[] outputs = new File[]{new File("bin/")};     
  3. try {     
  4.     fileManager.setLocation(location, Arrays.asList(outputs));     
  5. catch (IOException e) {     
  6.     e.printStackTrace();     
  7. }    

這段代碼的作用相信大家一看到它就想到它的作用了,前面有說過JavaFileManager 的作用,我在這里設置了CLASS文件的輸出目錄,意圖很簡單,我的工程是在Eclipse運行的,項目的目標路徑就是項目下的bin目錄,如果不設置的話,class文件輸出路徑即為默認值,也就是直接在項目根路徑下,后面直接調用就不能完成了。當然在其它一些應用場景中需要設置為自己需要的目錄。
同樣的方法可以設置JavaFileManager 其它的我們需要的文件規則屬性(可以參照枚舉類型StandardLocation),在這里就不一一介紹了。

 

 

責任編輯:金賀 來源: ITEYE博客
相關推薦

2024-04-01 08:41:39

字符串.NET

2022-12-27 09:33:28

2009-07-09 10:05:55

2009-12-17 13:23:25

Ruby eval方法

2024-06-26 08:18:08

ES6模板字符串

2021-09-07 09:23:07

C++字符串算法

2021-09-10 08:18:31

Go語言字符串

2010-02-25 13:58:22

Linux JDK

2009-11-26 13:11:24

PHP字符串

2009-12-01 09:18:50

PHP分割字符串

2023-12-11 07:33:05

Go語言字符技巧

2023-10-31 18:57:02

Java字符串

2010-03-23 11:17:16

Python 動態編譯

2009-08-04 18:10:35

ASP.NET動態編譯

2009-08-27 16:29:18

C#動態編譯

2009-02-26 16:28:43

靜態編譯動態編譯Java

2020-05-13 12:17:33

RedisC字符C語言

2022-08-29 23:49:41

Python字符串代碼

2009-08-04 18:05:37

動態編譯ASP.NET

2019-03-07 15:43:22

Redis數據SDS
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久久网站 | 日韩精品免费视频 | 在线视频91 | 九九久久这里只有精品 | 激情视频网站 | 四虎永久免费在线 | 亚洲自拍偷拍av | 国精日本亚洲欧州国产中文久久 | 欧美.com | 成人免费区一区二区三区 | 另类a v| 亚洲一二三在线观看 | 91在线免费观看网站 | 日韩一级在线 | 99精品视频一区二区三区 | 日本福利一区 | 免费看片在线播放 | 亚洲免费视频在线观看 | 天天看天天操 | www.蜜桃av.com| 色婷婷综合久久久中字幕精品久久 | 一区二区免费视频 | 亚洲精品一 | 成人中文字幕在线观看 | 日本淫视频 | 中文字幕 在线观看 | 国产h视频 | 日韩精品一区中文字幕 | 国产一级电影在线 | 日韩欧美国产精品一区 | 毛片免费看 | 国产精品毛片av | 国产午夜高清 | 国产精品久久九九 | 亚洲国产欧美一区 | 精品乱码一区二区三四区视频 | 国产高潮好爽受不了了夜夜做 | 国产视频中文字幕在线观看 | 亚洲欧美一区二区三区视频 | 日本不卡一区二区三区 | 日韩在线观看视频一区 |