摘要:動態(tài)編譯引入了編譯機制動態(tài)編譯的應(yīng)用場景可以做一個瀏覽器端編寫代碼上傳服務(wù)器編譯和運行的在線評測系統(tǒng)服務(wù)器動態(tài)加載某些類文件進行編譯動態(tài)編譯的兩種做法通過調(diào)用啟動新的進程去操作之前不是真正的動態(tài)編譯通過動態(tài)編譯通過動態(tài)編譯栗子編譯成功編譯
1.動態(tài)編譯
Java 6.0 引入了編譯機制
動態(tài)編譯的應(yīng)用場景:
可以做一個瀏覽器端編寫java代碼,上傳服務(wù)器編譯和運行的在線評測系統(tǒng)
服務(wù)器動態(tài)加載某些類文件進行編譯
?
動態(tài)編譯的兩種做法:
通過Runtime調(diào)用javac,啟動新的進程去操作(6.0之前,不是真正的動態(tài)編譯)
Runtime run = Runtime.getRuntime();
Process process = run.exec("javac -cp d:/myjava/Helloworld.java")
通過JavaCompiler動態(tài)編譯
?
通過JavaCompiler動態(tài)編譯
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
int result = compiler.run(null, null, null, "f:/HelloWorld.java");
Parameters:
in "standard" input; use System.in if null
out "standard" output; use System.out if null
err "standard" error; use System.err if null
arguments arguments to pass to the tool
栗子:
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); int result = compiler.run(null, null, null, "f:/HelloWorld.java"); System.out.println(result==0?"編譯成功":"編譯失敗");2.動態(tài)運行編譯好的類
通過Runtime.getRuntime()運行啟動新的進程運行
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); int result = compiler.run(null, null, null, "f:/HelloWorld.java"); System.out.println(result==0?"編譯成功":"編譯失敗"); Runtime run = Runtime.getRuntime(); Process process = run.exec("java -cp f: HelloWorld"); BufferedReader w = new BufferedReader(new InputStreamReader(process.getInputStream())); System.out.println(w.readLine());
通過反射運行編譯好的類
import java.io.IOException; import java.lang.reflect.Method; import java.net.URL; import java.net.URLClassLoader; import javax.tools.JavaCompiler; import javax.tools.ToolProvider; public class DynamicCompile { public static void main(String[] args) throws IOException { JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); int result = compiler.run(null, null, null, "f:/HelloWorld.java"); System.out.println(result==0?"編譯成功":"編譯失敗"); try { URL[] urls = new URL[]{new URL("file:/"+"f:/")}; URLClassLoader loader = new URLClassLoader(urls); Class> c = loader.loadClass("HelloWorld"); Method m = c.getMethod("main", String[].class); m.invoke(null, (Object)new String[]{});//靜態(tài)方法不用謝調(diào)用的對象 //加Object強制轉(zhuǎn)換的原因 //由于可變參數(shù)是JDK5.0之后才有 m.invoke(null, new String[]{"23","34"}); //編譯器會把它編譯成m.invoke(null,"23","34");的格式,會發(fā)生參數(shù)不匹配的問題 //帶數(shù)組的參數(shù)都這樣做 } catch (Exception e) { e.printStackTrace(); } } }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/71927.html
摘要:很多框架底層都使用了的動態(tài)代理技術(shù)來實現(xiàn)的,比如大名鼎鼎的這篇文章將帶你一步一步揭開動態(tài)代理技術(shù)的神秘面紗。接下來客戶端就可以這樣使用了毫秒到目前為止,我們實現(xiàn)的類可以為任何接口生成代理類了,是不是很神奇。 ? 動態(tài)代理是java語言中常用的設(shè)計模式,java在1.3版本以后也提供了動態(tài)代理技術(shù),允許開發(fā)者在運行期間創(chuàng)建接口的代理對象。 很多框架底層都使用了java的動態(tài)代理技術(shù)...
摘要:前言本文內(nèi)容基本摘抄自深入理解虛擬機,以供復(fù)習(xí)之用,沒有多少參考價值。此區(qū)域是唯一一個在虛擬機規(guī)范中沒有規(guī)定任何情況的區(qū)域。堆是所有線程共享的內(nèi)存區(qū)域,在虛擬機啟動時創(chuàng)建。虛擬機上把方法區(qū)稱為永久代。 前言 本文內(nèi)容基本摘抄自《深入理解Java虛擬機》,以供復(fù)習(xí)之用,沒有多少參考價值。想要更詳細(xì)了解請參考原書。 第二章 1.運行時數(shù)據(jù)區(qū)域 showImg(https://segment...
摘要:動態(tài)編程使用場景通過配置生成代碼,減少重復(fù)編碼,降低維護成本。動態(tài)生成字節(jié)碼操作字節(jié)碼的工具有,其中有兩個比較流行的,一個是,一個是。 作者簡介 傳恒,一個喜歡攝影和旅游的軟件工程師,先后從事餓了么物流蜂鳥自配送和蜂鳥眾包的開發(fā),現(xiàn)在轉(zhuǎn)戰(zhàn) Java,目前負(fù)責(zé)物流策略組分流相關(guān)業(yè)務(wù)的開發(fā)。 什么是動態(tài)編程 動態(tài)編程是相對于靜態(tài)編程而言的,平時我們討論比較多的靜態(tài)編程語言例如Java, 與動態(tài)...
摘要:代理模式從類型上來說,可以分為靜態(tài)代理和動態(tài)代理兩種類型。然而今天的重點是我們都知道牛逼轟轟的的實現(xiàn)的一種方式是使用的動態(tài)代理另一種是,大部分人也會用的動態(tài)代理,不過沒有研究過的動態(tài)代理到底是怎么實現(xiàn)的。 動態(tài)代理 代理模式是設(shè)計模式中非常重要的一種類型,而設(shè)計模式又是編程中非常重要的知識點,特別是在業(yè)務(wù)系統(tǒng)的重構(gòu)中,更是有舉足輕重的地位。代理模式從類型上來說,可以分為靜態(tài)代理和動態(tài)代...
摘要:除了和外,我們還有最后一招我直接把一個代理類的源代碼用字符串拼出來,然后基于這個字符串調(diào)用的編譯期,動態(tài)的創(chuàng)建一個新的文件,然后動態(tài)編譯這個文件,這樣也能得到一個新的代理類。 面試問題:Java里的代理設(shè)計模式(Proxy Design Pattern)一共有幾種實現(xiàn)方式?這個題目很像孔乙己問茴香豆的茴字有哪幾種寫法? showImg(https://segmentfault.com/...
閱讀 2580·2021-09-06 15:02
閱讀 3213·2021-09-02 10:18
閱讀 2835·2019-08-30 15:44
閱讀 695·2019-08-30 15:43
閱讀 1959·2019-08-30 14:08
閱讀 2767·2019-08-30 13:16
閱讀 1408·2019-08-26 13:52
閱讀 939·2019-08-26 12:21