成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Java動態(tài)性(1) - 動態(tài)編譯(DynamicCompile)

MartinDai / 1169人閱讀

摘要:動態(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

相關(guān)文章

  • Java動態(tài)代理實現(xiàn)原理(模擬實現(xiàn))

    摘要:很多框架底層都使用了的動態(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ù)...

    K_B_Z 評論0 收藏0
  • 讀書筆記之深入理解Java虛擬機

    摘要:前言本文內(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...

    jaysun 評論0 收藏0
  • Java動態(tài)編程初探

    摘要:動態(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)...

    趙連江 評論0 收藏0
  • 【干貨】JDK動態(tài)代理的實現(xiàn)原理以及如何手寫一個JDK動態(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)代...

    forsigner 評論0 收藏0
  • Java代理設(shè)計模式(Proxy)的四種具體實現(xiàn):靜態(tài)代理和動態(tài)代理

    摘要:除了和外,我們還有最后一招我直接把一個代理類的源代碼用字符串拼出來,然后基于這個字符串調(diào)用的編譯期,動態(tài)的創(chuàng)建一個新的文件,然后動態(tài)編譯這個文件,這樣也能得到一個新的代理類。 面試問題:Java里的代理設(shè)計模式(Proxy Design Pattern)一共有幾種實現(xiàn)方式?這個題目很像孔乙己問茴香豆的茴字有哪幾種寫法? showImg(https://segmentfault.com/...

    gclove 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<