JDK6動(dòng)態(tài)編譯的方法是什么

這篇文章主要介紹“JDK6動(dòng)態(tài)編譯的方法是什么”的相關(guān)知識(shí),小編通過(guò)實(shí)際案例向大家展示操作過(guò)程,操作方法簡(jiǎn)單快捷,實(shí)用性強(qiáng),希望這篇“JDK6動(dòng)態(tài)編譯的方法是什么”文章能幫助大家解決問(wèn)題。

西充網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)公司!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)公司等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)公司2013年至今到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)公司。

JDK6開始提供了動(dòng)態(tài)編譯的API,在許多應(yīng)用場(chǎng)景都可以用得著,如動(dòng)態(tài)加載(修改)服務(wù)、高性動(dòng)態(tài)業(yè)務(wù)邏輯實(shí)現(xiàn)(用腳本或模板引擎實(shí)現(xiàn)效率滿足不了需求)等都非常好用。
API對(duì)應(yīng)的接口都在javax.tools包下面,常用編譯方式有基于文本文件、內(nèi)存字符串等,實(shí)際上基于URI的字節(jié)流都可以,也就是遠(yuǎn)程Java源代碼也可以。對(duì)于常用的已有文件形式的動(dòng)態(tài)編譯網(wǎng)上的實(shí)例已經(jīng)非常多,我在這里介紹下動(dòng)態(tài)編譯內(nèi)存中以字符串的形式。
簡(jiǎn)單的代碼流程如下:

Java代碼

//通過(guò)系統(tǒng)工具提供者獲得動(dòng)態(tài)編譯器     JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();     //獲得一個(gè)文件管理器,它的功能主要是提供所有文件操作的規(guī)則,     //如源代碼路徑、編譯的classpath,class文件目標(biāo)目錄等,其相關(guān)屬性都提供默認(rèn)值     StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);         //獲得CompilationTask并調(diào)用     //獲得CompilationTask方法原型:     getTask(Writer out,          JavaFileManager fileManager,          DiagnosticListener<? super JavaFileObject> diagnosticListener,          Iterable options,          Iterable classes,          Iterable<? extends JavaFileObject> compilationUnits)             //簡(jiǎn)單調(diào)用例子     boolean b = jc.getTask(null, fileManager, null, null, null, compilationUnits).call();


我這里介紹的字符串形式的編譯(其它方式也會(huì)有相似的具體實(shí)現(xiàn)),還需要提供一個(gè)FileObject一個(gè)實(shí)現(xiàn)類,將相應(yīng)的對(duì)象封裝作為getTask()的最后一個(gè)參數(shù)來(lái)構(gòu)建具體的編譯Task.
JavaDoc提供的一個(gè)FileObject參考實(shí)現(xiàn):
Class JavaSourceFromString

Java代碼

import java.net.URI;         import javax.tools.SimpleJavaFileObject;         public class JavaSourceFromString extends SimpleJavaFileObject {             /**         *  源碼         */        final String code;             /**         * 構(gòu)造方法:從字符串中構(gòu)造一個(gè)FileObject         * @param name the name of the compilation unit represented by this file object         * @param code the source code for the compilation unit represented by this file object         */        JavaSourceFromString(String name, String code) {             super(URI.create("string:///" + name.replace('.','/') + Kind.SOURCE.extension),                   Kind.SOURCE);             this.code = code;         }             @Override        public CharSequence getCharContent(boolean ignoreEncodingErrors) {             return code;         }     }
 


完整的測(cè)試類:
Class TestDyCompile

Java代碼

import java.io.File;     import java.io.IOException;     import java.util.Arrays;         import javax.tools.JavaCompiler;     import javax.tools.JavaFileManager.Location;     import javax.tools.JavaFileObject;     import javax.tools.StandardJavaFileManager;     import javax.tools.StandardLocation;     import javax.tools.ToolProvider;         import dyclass.Test;             public class TestDyCompile {             /**         *          * @author ZhangXiang         * @param args         * 2011-4-7         */        public static void main(String[] args) {                          StringBuilder classStr = new StringBuilder("package dyclass;public class Foo implements Test{");             classStr.append("public void test(){");             classStr.append("System.out.println(\"Foo2\");}}");                          JavaCompiler jc = ToolProvider.getSystemJavaCompiler();             StandardJavaFileManager fileManager = jc.getStandardFileManager(null, null, null);             Location location = StandardLocation.CLASS_OUTPUT;             File[] outputs = new File[]{new File("bin/")};             try {                 fileManager.setLocation(location, Arrays.asList(outputs));             } catch (IOException e) {                 e.printStackTrace();             }                          JavaFileObject jfo = new JavaSourceFromString("dyclass.Foo", classStr.toString());             JavaFileObject[] jfos = new JavaFileObject[]{jfo};             Iterable<? extends JavaFileObject> compilationUnits = Arrays.asList(jfos);             boolean b = jc.getTask(null, fileManager, null, null, null, compilationUnits).call();             if(b){//如果編譯成功                 try {                     Test t = (Test) Class.forName("dyclass.Foo").newInstance();                     t.test();                 } catch (InstantiationException e) {                     e.printStackTrace();                 } catch (IllegalAccessException e) {                     e.printStackTrace();                 } catch (ClassNotFoundException e) {                     e.printStackTrace();                 }             }         }     }


我在這里的具體業(yè)務(wù)類為dyclass.Foo,也就是我們需要?jiǎng)討B(tài)編譯的類,為了方便寫業(yè)務(wù)的調(diào)用代碼,也可以讓我們的業(yè)務(wù)類實(shí)現(xiàn)一個(gè)接口,然后通過(guò)反射獲得具體子類強(qiáng)制轉(zhuǎn)換來(lái)調(diào)用。
Test接口:

Java代碼

public interface Test {         //業(yè)務(wù)方法簽名         void test();     }


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

Java代碼

  Location location = StandardLocation.CLASS_OUTPUT;              File[] outputs = new File[]{new File("bin/")};     try {         fileManager.setLocation(location, Arrays.asList(outputs));     } catch (IOException e) {         e.printStackTrace();     }

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

關(guān)于“JDK6動(dòng)態(tài)編譯的方法是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。

網(wǎng)頁(yè)名稱:JDK6動(dòng)態(tài)編譯的方法是什么
文章路徑:http://bm7419.com/article36/psddsg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信小程序網(wǎng)站排名、外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站導(dǎo)航、企業(yè)建站、域名注冊(cè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化