黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節(jié)點(diǎn)LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 hot資訊 基于Spring Boot的Java在線編譯工具

基于Spring Boot的Java在線編譯工具

更新時間:2021-11-18 10:50:03 來源:動力節(jié)點(diǎn) 瀏覽1038次

Java開發(fā)工具中,有一種是基于Spring Boot的Java在線編譯工具,下面小編來給大家介紹。

項目運(yùn)行流程

程序運(yùn)行流程圖如下

接下來開始具體分析每一步的實(shí)現(xiàn)方法

一個Java程序是怎樣運(yùn)行起來的

想要實(shí)現(xiàn)在線運(yùn)行Java代碼的需求,我們首先需要了解Java程序正常的編譯和運(yùn)行流程。

首先源代碼文件(.java)經(jīng)由編譯器編譯成字節(jié)碼

例如JDK中的javac命令就是實(shí)現(xiàn)字節(jié)碼生成技術(shù)的程序

接下來有Java虛擬機(jī)解釋并運(yùn)行字節(jié)碼文件,運(yùn)行過程有分為兩個步驟

類的加載

應(yīng)用程序運(yùn)行后,系統(tǒng)會啟動一個虛擬機(jī)進(jìn)程。JVM進(jìn)程在類的加載階段首先會通過一個類的全限定類名獲取定義此類的二進(jìn)制字節(jié)流,然后將這個字節(jié)流所代表的靜態(tài)存儲結(jié)構(gòu)轉(zhuǎn)化為方法區(qū)的運(yùn)行時數(shù)據(jù)結(jié)構(gòu),并且在內(nèi)存中生成一個代表這個類的java.lang.Class對象,作為方法區(qū)這個類的各種數(shù)據(jù)訪問入口。

類加載的相關(guān)的內(nèi)容比較復(fù)雜,生成對應(yīng)的Class對象后還會進(jìn)行驗(yàn)證、準(zhǔn)備、解析、初始化等一系列步驟才算加載完成,但考慮到篇幅問題這里就不再展開說明了。

類的執(zhí)行

當(dāng)類加載完成后JVM就可以找到main方法執(zhí)行了。

本項目中使用反射來完成這一步驟。

明確了以上步驟后,我們發(fā)現(xiàn)有三個問題需要解決:

如何編譯提交到服務(wù)器的Java代碼?

在本地運(yùn)行Java代碼的時候我們可以選用Javac命令編譯。對于本項目而言,這種方式需要我們先將源代碼寫入一個.java文件,再編譯得到.class文件。但是這樣一來不僅非常耗時,而且還會生成額外的文件,導(dǎo)致服務(wù)器環(huán)境被污染。因此我們選擇使用JDK1.6以后添加的動態(tài)編譯API來解決這一問題。

如何執(zhí)行編譯之后的代碼?

一段程序往往不是編寫、運(yùn)行一次就能達(dá)到效果的。同一個類可能需要反復(fù)的修改、提交、運(yùn)行。另外,提交的類也要能訪問服務(wù)端的其他類庫才行,對于這一問題,需要我們自己編寫類加載器來實(shí)現(xiàn)需求。

如何收集Java代碼的執(zhí)行結(jié)果?

我們需要把程序向標(biāo)準(zhǔn)輸出(System.out)和標(biāo)準(zhǔn)錯誤輸出(System.err)中打印的信息收集起來返回給客戶端。但是標(biāo)準(zhǔn)輸出設(shè)備是整個虛擬機(jī)進(jìn)程全局共享的資源。如果使用System.setOut()/System.setErr()方法將輸出流重定向到自己定義的PrintStream上固然可以收集信息,但在多線程情況下這樣會連帶其他線程的信息一起收集了,這顯然不是我們希望看到的。因此我們選擇將程序中的System替換為我們自己寫的HackSystem類。

也就是說,我們的重點(diǎn)在于實(shí)現(xiàn)編譯模塊和運(yùn)行模塊。 在理清以上思路后,我們就可以正式開始代碼的編寫了。

Spring Boot相關(guān)

在正式開始編碼前還要羅嗦一下,本項目選擇使用Spring Boot僅僅是看中了它在開發(fā)web應(yīng)用時的方便、快捷,項目中并不會涉及太多框架方面的知識。

如果對于Spring Boot的自動配置原理感興趣,可以閱讀下筆者寫的另一篇文章,記錄了筆者對于Spring Boot自動配置原理的一些粗淺認(rèn)識,歡迎各位大神斧正。

編譯模塊:compile

使用動態(tài)編譯的方式可以直接在內(nèi)存中對一個Java程序進(jìn)行編譯并輸出到內(nèi)存中,提高程序運(yùn)行效率的同時還不會污染服務(wù)器環(huán)境,可謂一舉兩得。具體實(shí)現(xiàn)步驟如下。

動態(tài)編譯

關(guān)于動態(tài)編譯的API全部放在javax.tools包下,本項目中主要涉及到的類和接口如下所示:

編譯器:

JavaCompiler

ToolProvider

源代碼文件:

JavaFileObject

SimpleJavaFIleObject

文件管理器:

JavaFileManager

StandardJavaFileManager

ForwardingJavaFileManager

收集診斷信息:

DiagnosticListener

DiagnosticCollector

接下來開始具體介紹實(shí)現(xiàn)動態(tài)編譯的步驟

準(zhǔn)備編譯器對象

只有一種方法:

//獲取Java語言編譯器
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
//開始執(zhí)行編譯,通過傳入自己的JavaFileManager為編譯器創(chuàng)建存放字節(jié)碼的JavaFIleObject對象
Boolean result = compiler.getTask(null,javaFileManager,compileCollector,
                null,null, Arrays.asList(sourceJavaFileObject)).call();

關(guān)于ToolProvider這里有一個坑,如果使用的是OpenJDK,tools.jar文件是放在%JAVA_HOME%/lib下的,運(yùn)行起來就會報空指針異常。因?yàn)閱觠ava的目錄默認(rèn)是%JAVA_HOME%/jre/bin/java.exe,這個目錄的lib目錄為%JAVA_HOME%/jre/lib,里面沒有tools.jar。因此要么把文件拷到指定的lib下,要么干脆使用Oracle JDK也是一切正常。

可以看到執(zhí)行編譯這個方法要填一大堆參數(shù),這些參數(shù)就是我們實(shí)現(xiàn)在內(nèi)存中編譯源代碼的關(guān)鍵。

API中對于這個方法參數(shù)的解釋如下

JavaCompiler.CompilationTask getTask(Writer out,
                                     JavaFileManager fileManager,
                                     DiagnosticListener<? super JavaFileObject> diagnosticListener,
                                     Iterable<String> options,
                                     Iterable<String> classes,
                                     Iterable<? extends JavaFileObject> compilationUnits)

out - 用于編譯器的附加輸出; 如果為null使用的就是使用System.err

fileManager - 文件管理器; 如果null使用編譯器的標(biāo)準(zhǔn)文件管理器

diagnosticListener - 診斷信息收集器; 如果為null則使用編譯器的默認(rèn)方法來報告診斷

options - 編譯器選項, null表示沒有選項

classes - 通過注釋處理類的名稱, null表示沒有類名

compilationUnits - 編譯單元, null表示無編譯單位

大家如果想了解更多相關(guān)知識,不妨來關(guān)注一下動力節(jié)點(diǎn)的Java在線學(xué)習(xí),里面的課程內(nèi)容豐富,從入門到精通,適合小白學(xué)習(xí),希望對大家能夠有所幫助。

提交申請后,顧問老師會電話與您溝通安排學(xué)習(xí)

免費(fèi)課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 日韩不卡在线观看 | 国产一区二区三区在线观看视频 | 国产亚洲第一伦理第一区 | 日本中文字幕在线观看 | 国产伦精品一区二区三区免 | 欧美日韩激情 | 国产欧美日本亚洲精品一4区 | 国产精品欧美亚洲韩国日本99 | www.伊人| 欧美精品在线免费 | 免费的色视频 | 国产苐1页影院草草影院 | 欧美人视频在线观看视频 | 久久精品免费播放 | 吃奶呻吟打开双腿做受动态图 | 欧美不卡激情三级在线观看 | 国产精品亚洲午夜一区二区三区 | 嘿嘿嘿视频免费网站在线观看 | 你懂的在线视频播放 | 久久乐播| 日韩深夜福利视频 | 黄色成人在线播放 | 人人干人人舔 | 中文字幕视频在线免费观看 | 美女视频黄是免费的 | 日韩性视频网站 | 亚洲精品1区 | 毛片www| 制服丝袜第一页在线观看 | 亚洲美女爱做色禁图无遮 | 日日操天天爽 | 自拍偷拍 欧美日韩 | 黄色三级小视频 | 欧美老妇69交 | 日本一区二区三区免费观看 | 波多野结衣在线不卡 | 性欧美13处丶14处 | 国产午夜剧场 | 日韩大片免费观看 | 日韩三级在线免费观看 | 国产成人18黄禁网站免费观看 |