国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Java動態性(1) - 動態編譯(DynamicCompile)

MartinDai / 1167人閱讀

摘要:動態編譯引入了編譯機制動態編譯的應用場景可以做一個瀏覽器端編寫代碼上傳服務器編譯和運行的在線評測系統服務器動態加載某些類文件進行編譯動態編譯的兩種做法通過調用啟動新的進程去操作之前不是真正的動態編譯通過動態編譯通過動態編譯栗子編譯成功編譯

1.動態編譯

Java 6.0 引入了編譯機制

動態編譯的應用場景:

可以做一個瀏覽器端編寫java代碼,上傳服務器編譯和運行的在線評測系統

服務器動態加載某些類文件進行編譯
?

動態編譯的兩種做法:

通過Runtime調用javac,啟動新的進程去操作(6.0之前,不是真正的動態編譯)

Runtime run = Runtime.getRuntime();

Process process = run.exec("javac -cp d:/myjava/Helloworld.java")

通過JavaCompiler動態編譯
?

通過JavaCompiler動態編譯

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.動態運行編譯好的類

通過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[]{});//靜態方法不用謝調用的對象
            //加Object強制轉換的原因
            //由于可變參數是JDK5.0之后才有 m.invoke(null, new String[]{"23","34"});
            //編譯器會把它編譯成m.invoke(null,"23","34");的格式,會發生參數不匹配的問題
            //帶數組的參數都這樣做
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/71927.html

相關文章

  • Java動態代理實現原理(模擬實現)

    摘要:很多框架底層都使用了的動態代理技術來實現的,比如大名鼎鼎的這篇文章將帶你一步一步揭開動態代理技術的神秘面紗。接下來客戶端就可以這樣使用了毫秒到目前為止,我們實現的類可以為任何接口生成代理類了,是不是很神奇。 ? 動態代理是java語言中常用的設計模式,java在1.3版本以后也提供了動態代理技術,允許開發者在運行期間創建接口的代理對象。 很多框架底層都使用了java的動態代理技術...

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

    摘要:前言本文內容基本摘抄自深入理解虛擬機,以供復習之用,沒有多少參考價值。此區域是唯一一個在虛擬機規范中沒有規定任何情況的區域。堆是所有線程共享的內存區域,在虛擬機啟動時創建。虛擬機上把方法區稱為永久代。 前言 本文內容基本摘抄自《深入理解Java虛擬機》,以供復習之用,沒有多少參考價值。想要更詳細了解請參考原書。 第二章 1.運行時數據區域 showImg(https://segment...

    jaysun 評論0 收藏0
  • Java動態編程初探

    摘要:動態編程使用場景通過配置生成代碼,減少重復編碼,降低維護成本。動態生成字節碼操作字節碼的工具有,其中有兩個比較流行的,一個是,一個是。 作者簡介 傳恒,一個喜歡攝影和旅游的軟件工程師,先后從事餓了么物流蜂鳥自配送和蜂鳥眾包的開發,現在轉戰 Java,目前負責物流策略組分流相關業務的開發。 什么是動態編程 動態編程是相對于靜態編程而言的,平時我們討論比較多的靜態編程語言例如Java, 與動態...

    趙連江 評論0 收藏0
  • 【干貨】JDK動態代理的實現原理以及如何手寫一個JDK動態代理

    摘要:代理模式從類型上來說,可以分為靜態代理和動態代理兩種類型。然而今天的重點是我們都知道牛逼轟轟的的實現的一種方式是使用的動態代理另一種是,大部分人也會用的動態代理,不過沒有研究過的動態代理到底是怎么實現的。 動態代理 代理模式是設計模式中非常重要的一種類型,而設計模式又是編程中非常重要的知識點,特別是在業務系統的重構中,更是有舉足輕重的地位。代理模式從類型上來說,可以分為靜態代理和動態代...

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

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

    gclove 評論0 收藏0

發表評論

0條評論

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