日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

java动态编译

發(fā)布時(shí)間:2023/12/20 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java动态编译 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、使用 JavaCompiler 接口來(lái)編譯 java 源程序(最簡(jiǎn)單的)

使用 Java API 來(lái)編譯 Java 源程式有非常多方法,目前讓我們來(lái)看一種最簡(jiǎn)單的方法,通過(guò) JavaCompiler 進(jìn)行編譯。

我們能通過(guò) ToolProvider 類的靜態(tài)方法 getSystemJavaCompiler 來(lái)得到一個(gè) JavaCompiler 接 口的實(shí)例。


JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();


JavaCompiler 中最核心的方法是 run。通過(guò)這個(gè)方法能編譯 java 源程序。這個(gè)方法有 3 個(gè)固 定參數(shù)和 1 個(gè)可變參數(shù)(可變參數(shù)是從 Jave SE5 開(kāi)始提供的一個(gè)新的參數(shù)類型,用 type... argu 表 示)。前 3 個(gè)參數(shù)分別用來(lái)為 java 編譯器提供參數(shù)、得到 Java 編譯器的輸出信息及接收編譯器的 錯(cuò)誤信息,后面的可變參數(shù)能傳入一個(gè)或多個(gè) Java 源程式文件。如果 run 編譯成功,返回 0。

int run(InputStream in, OutputStream out, OutputStream err, String... arguments)

如果前 3 個(gè)參數(shù)傳入的是 null,那么 run 方法將以標(biāo)準(zhǔn)的輸入、輸出代替,即 System.in、 System.out 和 System.err。如果我們要編譯一個(gè) hello.java 文件,并將使用標(biāo)準(zhǔn)輸入輸出,run 的使用方法如下:

int results = tool.run(null, null, null, "Hello.java");

完整代碼如下(用的是 eclipse 工具)


package com.dongtai.demo;?

import java.io.BufferedReader;?
import java.io.IOException;?
import java.io.InputStream;?
import java.io.InputStreamReader;?

import javax.tools.JavaCompiler;?
import javax.tools.ToolProvider;?

public class DynamicCompileTest {?
?? ?public static void main(String[] args) throws IOException {?
?? ??? ?// 編譯程序?
?? ??? ?JavaCompiler javaCompiler = ToolProvider.getSystemJavaCompiler();?
?? ??? ?int result = javaCompiler.run(null, null, null, "-d","./temp/","./temp/com/Hello.java");?
?? ??? ?System.out.println( result == 0 ? "恭喜編譯成功" : "對(duì)不起編譯失敗");?
?? ??? ??
?? ??? ?// 運(yùn)行程序?
?? ??? ?Runtime run = Runtime.getRuntime();?
?? ??? ?Process process = run.exec("java -cp ./temp temp/com/Hello");?
?? ??? ?InputStream in = process.getInputStream();?
?? ??? ?BufferedReader reader = new BufferedReader(new InputStreamReader(in));?
?? ??? ?String info? = "";?
?? ??? ?while ((info = reader.readLine()) != null) {?
?? ??? ??? ?System.out.println(info);?
?? ??? ??? ??? ??
?? ??? ?}?
?? ?}?
}?

?

?

二、使用 StandardJavaFileManager 編譯 Java 源程序

在第一部分我們討論調(diào)用 java 編譯器的最容易的方法。這種方法能非常好地工作,但他確不 能更有效地得到我們所需要的信息,如標(biāo)準(zhǔn)的輸入、輸出信息。而在 Java SE6 中最佳的方法是使 用 StandardJavaFileManager 類。這個(gè)類能非常好地控制輸入、輸出,并且能通過(guò) DiagnosticListener 得到診斷信息,而 DiagnosticCollector 類就是 listener 的實(shí)現(xiàn)。

使用 StandardJavaFileManager 需要兩步。首先建立一個(gè) DiagnosticCollector 實(shí)例及通過(guò) JavaCompiler 的 getStandardFileManager()方法得到一個(gè) StandardFileManager 對(duì)象。最后通過(guò) CompilationTask 中的 call 方法編譯源程序

每個(gè)類的具體方法參數(shù)可以查看 jase6 API 文檔。上面有很詳細(xì)的解釋


package com.dongtai.demo;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Arrays;

import javax.tools.JavaCompiler;
import javax.tools.JavaCompiler.CompilationTask;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;

public class DynamicCompileTest {
?? ?public static void main(String[] args) throws IOException{
?? ??? ?// 1.創(chuàng)建需要?jiǎng)討B(tài)編譯的代碼字符串
?? ??? ?String nr = "\r\n"; //回車
?? ??? ?String source = "package temp.com; " + nr +
?? ??? ??? ??? ?" public class? Hello{" + nr +?
?? ??? ??? ??? ??? ?" public static void main (String[] args){" + nr +?
?? ??? ??? ??? ??? ??? ?" System.out.println(\"HelloWorld! 1\");" + nr +
?? ??? ??? ??? ??? ?" }" + nr +
?? ??? ??? ??? ?" }";
?? ??? ?// 2.將欲動(dòng)態(tài)編譯的代碼寫入文件中 1.創(chuàng)建臨時(shí)目錄 2.寫入臨時(shí)文件目錄
?? ??? ?File dir = new File(System.getProperty("user.dir") + "/temp"); //臨時(shí)目錄
?? ??? ?// 如果 \temp 不存在 就創(chuàng)建
?? ??? ?if (!dir.exists()) {
?? ??? ??? ?dir.mkdir();
?? ??? ?}
?? ??? ?FileWriter writer = new FileWriter(new File(dir,"Hello.java"));
?? ??? ?writer.write(source);
?? ??? ?writer.flush();
?? ??? ?writer.close();
?? ??? ?
?? ??? ?// 3.取得當(dāng)前系統(tǒng)的編譯器
?? ??? ?JavaCompiler javaCompiler = ToolProvider.getSystemJavaCompiler();
?? ??? ?// 4.獲取一個(gè)文件管理器
?? ??? ?StandardJavaFileManager javaFileManager = javaCompiler.getStandardFileManager(null, null, null);
?? ??? ?// 5.文件管理器根與文件連接起來(lái)
?? ??? ?Iterable it = javaFileManager.getJavaFileObjects(new File(dir,"Hello.java"));
?? ??? ?// 6.創(chuàng)建編譯任務(wù)
?? ??? ?CompilationTask task = javaCompiler.getTask(null, javaFileManager, null, Arrays.asList("-d", "./temp"), null, it);
?? ??? ?// 7.執(zhí)行編譯
?? ??? ?task.call();
?? ??? ?javaFileManager.close();
?? ??? ?
?? ??? ?// 8.運(yùn)行程序
?? ??? ?Runtime run = Runtime.getRuntime();
?? ??? ?Process process = run.exec("java -cp ./temp temp/com/Hello");
?? ??? ?InputStream in = process.getInputStream();
?? ??? ?BufferedReader reader = new BufferedReader(new InputStreamReader(in));
?? ??? ?String info? = "";
?? ??? ?while ((info = reader.readLine()) != null) {
?? ??? ??? ?System.out.println(info);
?? ??? ??? ?
?? ??? ?}
?? ?}
}

?

?

三、從內(nèi)存中動(dòng)態(tài)編譯 java 程序

JavaCompiler 不僅能編譯硬盤上的 Java 文件,而且還能編譯內(nèi)存中的 Java 代碼,然后使?
用 reflection 來(lái)運(yùn)行他們。我們能編寫一個(gè)類,通過(guò)這個(gè)類能輸入 Java 原始碼。一但建立這個(gè)對(duì)
象,你能向其中輸入任意的 Java 代碼,然后編譯和運(yùn)行。

?


package com.dongtai.demo;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.URI;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Arrays;

import javax.tools.JavaCompiler;
import javax.tools.JavaCompiler.CompilationTask;
import javax.tools.JavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;

public class DynamicCompileTest {
?? ?public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, InstantiationException{
?? ??? ?
?? ??? ?/*
?? ??? ? * 編譯內(nèi)存中的java代碼
?? ??? ? * */
?? ??? ?// 1.將代碼寫入內(nèi)存中
?? ??? ?StringWriter writer = new StringWriter(); // 內(nèi)存字符串輸出流
?? ??? ?PrintWriter out = new PrintWriter(writer);
?? ??? ?out.println("package com.dongtai.hello;");
?? ??? ?out.println("public class Hello{");
?? ??? ?out.println("public static void main(String[] args){");
?? ??? ?out.println("System.out.println(\"HelloWorld! 2\");");
?? ??? ?out.println("}");
?? ??? ?out.println("}");
?? ??? ?out.flush();
?? ??? ?out.close();
?? ??? ?
?? ??? ?// 2.開(kāi)始編譯
?? ??? ?JavaCompiler javaCompiler = ToolProvider.getSystemJavaCompiler();
?? ??? ?JavaFileObject fileObject = new JavaStringObject("Hello", writer.toString());
?? ??? ?CompilationTask task = javaCompiler.getTask(null, null, null, Arrays.asList("-d","./bin"), null, Arrays.asList(fileObject));
?? ??? ?boolean success = task.call();
?? ??? ?if (!success) {
?? ??? ??? ?System.out.println("編譯失敗");
?? ??? ?}else{
?? ??? ??? ?System.out.println("編譯成功");
?? ??? ?}
?? ??? ?URL[] urls = new URL[]{new URL("file:/" + "./bin/")};
?? ??? ?URLClassLoader classLoader = new URLClassLoader(urls);
?? ??? ?Class classl = classLoader.loadClass("com.dongtai.hello.Hello");
?? ??? ?Method method = classl.getDeclaredMethod("main", String[].class);
?? ??? ?String[] argsl = {null};
?? ??? ?method.invoke(classl.newInstance(), argsl);
?? ?
?? ?}
}

引用至:http://www.cnblogs.com/snake-hand/p/3159694.html

總結(jié)

以上是生活随笔為你收集整理的java动态编译的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 成人福利在线视频 | 我们2018在线观看免费版高清 | 日本体内she精高潮 男女视频在线免费观看 | 亚洲天堂成人网 | 香港三级日本三级韩国三级 | 欧美成人黄色 | 国产喷水在线 | 亚洲欧美日韩图片 | 综合色在线 | www.色偷偷| 欧美日韩1 | 国产精品一区二区三区四区 | 亚洲欧美校园春色 | 操极品 | 国产一级二级在线观看 | 捆绑凌虐一区二区三区 | a一级视频 | 久久久久久久久久网站 | 末发成年娇小性xxxxx | 15p亚洲 | 欧美亚洲视频 | 国产一级久久 | 在线视频一区二区 | 国产视频福利 | 日本成人a| 视频二区中文字幕 | 日韩精品91 | 色一涩| 体内精69xxxxxx| 麻豆午夜视频 | 伊人久久综合 | 中文字幕免费播放 | 香蕉久操| 亚洲免费网站 | 少妇一级淫片免费放播放 | 欧美男人亚洲天堂 | av导航站| 国产一区二区在 | 夜夜骑狠狠干 | 日操操| 国产精品成人久久久 | 456亚洲影视 | 精品国产va久久久久久久 | 成人黄色免费网站 | 色香蕉在线视频 | 亚洲av电影天堂男人的天堂 | 国模小黎自慰gogo人体 | 精品乱码一区二区三区四区 | 欧美成人免费在线观看视频 | 国产精品久久av无码一区二区 | 国产伦精品一区二区三 | 国产喷白浆一区二区三区 | 被扒开腿一边憋尿一边惩罚 | 欧美午夜网 | 日韩免| 91成人精品视频 | 黄页网站在线播放 | 人人澡人人爽 | 亚洲三级电影 | 亚洲国产视频一区二区 | 97在线公开视频 | 四虎国产精品永久免费观看视频 | 懂色视频在线观看 | 日韩av免费看 | 999精品在线观看 | 欧美日韩网站 | 国产情侣自拍小视频 | 国产免费啪啪 | 男女啊啊啊视频 | 午夜av免费| 日韩一区2区 | 成人亚洲欧美 | 国产精品免费久久 | 欧美成人hd | 日日噜| 变态另类一区二区 | 色妞色视频一区二区三区四区 | 欧美人在线| 中文字幕成人动漫 | 久久免费黄色 | 国产精品久久久亚洲 | 香港三级日本三级 | 毛片国产精品 | 农村妇女毛片 | av不卡影院| 免费午夜视频 | 欧美片网站yy | 亚洲自拍色图 | 日韩性生交大片免费看 | 成人国产精品 | 黄在线观看 | 91原创视频在线观看 | 国产真人做爰毛片视频直播 | 亚洲欧美视频在线播放 | 亚洲国产精品无码久久久久高潮 | 午夜91视频 | 欧美老熟妇一区二区 | 少妇被又大又粗又爽毛片久久黑人 | 2017天天干 |