如果你用的是相應(yīng)的編輯器
成都創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),壽陽(yáng)企業(yè)網(wǎng)站建設(shè),壽陽(yáng)品牌網(wǎng)站建設(shè),網(wǎng)站定制,壽陽(yáng)網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,壽陽(yáng)網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
在工具欄上有編譯
如果用的是記事本
改后綴名后吧文件保存在安裝jdk的目錄下
然后啟動(dòng)命令提示符
輸入javac
xx.java
xx.java
為你的java源代碼
1. CodeSandbox(基于 React 的在線代碼沙盒平臺(tái)) 我常用的
① 主流的腳手架都支持,比如在線create-react-app,vue-cli等(在線 fork 修改),支持 github 登錄(項(xiàng)目導(dǎo)入),也支持 cli 上傳例子,例子可以在線訪問(wèn)和下載,當(dāng)然也支持內(nèi)嵌到其他博客等網(wǎng)頁(yè)中。
② 地址:
③ 圖示
2. CodePen(前端代碼編輯運(yùn)行的網(wǎng)站)
① CodePen 是一個(gè)完全免費(fèi)的前端代碼托管服務(wù),主要功能有:
② 地址:
③ 圖示
3. JSRUN(支持手機(jī)端的在線JS編輯器)
① jsrun是一款支持手機(jī)端的在線JS編輯器, HTML/CSS/Javascript在線代碼運(yùn)行工具,js代碼在線測(cè)試調(diào)試,是runjs的升級(jí)版支持vue.js/angular.js的在線編輯器
② 地址:
③ 圖示
4. jsFiddle(前端代碼編輯運(yùn)行的網(wǎng)站)
① jsFiddle 是一個(gè)Web開(kāi)發(fā)人員的練習(xí)場(chǎng),可在線編輯和測(cè)試 HTML、CSS、JavaScript代碼片段。在 jsFiddle 編輯的代碼,可以保存,也可分享給其他人,還可嵌入到其他網(wǎng)頁(yè)
② 地址:
③ 圖示
5. Ideone(C和C++的在線編譯和調(diào)試工具,支持其他的60種語(yǔ)言) 我常用
① Ideone是C和C++的在線編譯和調(diào)試工具,支持其他的60種語(yǔ)言。這個(gè)工具提供許多強(qiáng)大的功能,允許程序員快速高效的編譯源代碼
② 地址:
③ 圖示
6. Codechef(C,C ++和Java的在線編譯工具)
① 它支持C,C ++和Java,非常接近真正的桌面IDE。這是超快速和易于使用。適合于課堂和作業(yè)的學(xué)生,練習(xí)面試問(wèn)題。
② 地址:
③ 圖示
7. JDoodle (C,C ++和Java的在線IDE)
① 支持協(xié)作代碼。它只是從一個(gè)簡(jiǎn)單的文本區(qū)域開(kāi)始,您可以粘貼代碼,然后單擊運(yùn)行。您可以更改命令行參數(shù)并在運(yùn)行該程序之前設(shè)置stdin。最適合新的在線編輯器不支持的許多舊語(yǔ)言。
② 地址:
③ 圖示
8. OnlineGDB (在線C,C ++,Java,PHP編譯器) 我常用
① 它支持C,C ++,PHP和Java編譯器。OnlineGDB的獨(dú)特功能是,您可以逐步調(diào)試您的代碼。一旦代碼被寫入,它可以很容易地格式化,使其看起來(lái)不錯(cuò)。
② 地址:
③ 圖示
9. GCC資源管理器
① GCC編譯器資源管理器是一個(gè)交互式在線編譯器,它顯示編譯后的C++、RISE、GO(以及更多)代碼的匯編輸出。
② 地址:
③ 圖示
10. plnkr edit在線編輯器
① js的在線編輯器。
② 地址:
③ 圖示
在一般的Java應(yīng)用開(kāi)發(fā)過(guò)程中,開(kāi)發(fā)人員使用Java的方式比較簡(jiǎn)單。打開(kāi)慣用的IDE,編寫Java源代碼,再利用IDE提供的功能直接運(yùn)行Java 程序就可以了。這種開(kāi)發(fā)模式背后的過(guò)程是:開(kāi)發(fā)人員編寫的是Java源代碼文件(.java),IDE會(huì)負(fù)責(zé)調(diào)用Java的編譯器把Java源代碼編譯成平臺(tái)無(wú)關(guān)的字節(jié)代碼(byte code),以類文件的形式保存在磁盤上(.class)。Java虛擬機(jī)(JVM)會(huì)負(fù)責(zé)把Java字節(jié)代碼加載并執(zhí)行。Java通過(guò)這種方式來(lái)實(shí)現(xiàn)其“編寫一次,到處運(yùn)行(Write once, run anywhere)” 的目標(biāo)。Java類文件中包含的字節(jié)代碼可以被不同平臺(tái)上的JVM所使用。Java字節(jié)代碼不僅可以以文件形式存在于磁盤上,也可以通過(guò)網(wǎng)絡(luò)方式來(lái)下載,還可以只存在于內(nèi)存中。JVM中的類加載器會(huì)負(fù)責(zé)從包含字節(jié)代碼的字節(jié)數(shù)組(byte[])中定義出Java類。在某些情況下,可能會(huì)需要?jiǎng)討B(tài)的生成 Java字節(jié)代碼,或是對(duì)已有的Java字節(jié)代碼進(jìn)行修改。這個(gè)時(shí)候就需要用到本文中將要介紹的相關(guān)技術(shù)。首先介紹一下如何動(dòng)態(tài)編譯Java源文件。
動(dòng)態(tài)編譯Java源文件
在一般情況下,開(kāi)發(fā)人員都是在程序運(yùn)行之前就編寫完成了全部的Java源代碼并且成功編譯。對(duì)有些應(yīng)用來(lái)說(shuō),Java源代碼的內(nèi)容在運(yùn)行時(shí)刻才能確定。這個(gè)時(shí)候就需要?jiǎng)討B(tài)編譯源代碼來(lái)生成Java字節(jié)代碼,再由JVM來(lái)加載執(zhí)行。典型的場(chǎng)景是很多算法競(jìng)賽的在線評(píng)測(cè)系統(tǒng)(如PKU JudgeOnline),允許用戶上傳Java代碼,由系統(tǒng)在后臺(tái)編譯、運(yùn)行并進(jìn)行判定。在動(dòng)態(tài)編譯Java源文件時(shí),使用的做法是直接在程序中調(diào)用Java編譯器。
JSR 199引入了Java編譯器API。如果使用JDK 6的話,可以通過(guò)此API來(lái)動(dòng)態(tài)編譯Java代碼。比如下面的代碼用來(lái)動(dòng)態(tài)編譯最簡(jiǎn)單的Hello World類。該Java類的代碼是保存在一個(gè)字符串中的。
01 public class CompilerTest {
02 public static void main(String[] args) throws Exception {
03 String source = "public class Main { public static void main(String[] args) {System.out.println(\"Hello World!\");} }";
04 JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
05 StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
06 StringSourceJavaObject sourceObject = newCompilerTest.StringSourceJavaObject("Main", source);
07 Iterable extends JavaFileObject fileObjects = Arrays.asList(sourceObject);
08 CompilationTask task = compiler.getTask(null, fileManager, null,null, null, fileObjects);
09 boolean result = task.call();
10 if (result) {
11 System.out.println("編譯成功。");
12 }
13 }
14
15 static class StringSourceJavaObject extends SimpleJavaFileObject {
16
17 private String content = null;
18 public StringSourceJavaObject(String name, String content) ??throwsURISyntaxException {
19 super(URI.create("string:///" + name.replace('.','/') + Kind.SOURCE.extension), Kind.SOURCE);
20 this.content = content;
21 }
22
23 public CharSequence getCharContent(boolean ignoreEncodingErrors) ??throws IOException {
24 return content;
25 }
26 }
27 }
如果不能使用JDK 6提供的Java編譯器API的話,可以使用JDK中的工具類com.sun.tools.javac.Main,不過(guò)該工具類只能編譯存放在磁盤上的文件,類似于直接使用javac命令。
另外一個(gè)可用的工具是Eclipse JDT Core提供的編譯器。這是Eclipse Java開(kāi)發(fā)環(huán)境使用的增量式Java編譯器,支持運(yùn)行和調(diào)試有錯(cuò)誤的代碼。該編譯器也可以單獨(dú)使用。Play框架在內(nèi)部使用了JDT的編譯器來(lái)動(dòng)態(tài)編譯Java源代碼。在開(kāi)發(fā)模式下,Play框架會(huì)定期掃描項(xiàng)目中的Java源代碼文件,一旦發(fā)現(xiàn)有修改,會(huì)自動(dòng)編譯 Java源代碼。因此在修改代碼之后,刷新頁(yè)面就可以看到變化。使用這些動(dòng)態(tài)編譯的方式的時(shí)候,需要確保JDK中的tools.jar在應(yīng)用的 CLASSPATH中。
下面介紹一個(gè)例子,是關(guān)于如何在Java里面做四則運(yùn)算,比如求出來(lái)(3+4)*7-10的值。一般的做法是分析輸入的運(yùn)算表達(dá)式,自己來(lái)模擬計(jì)算過(guò)程??紤]到括號(hào)的存在和運(yùn)算符的優(yōu)先級(jí)等問(wèn)題,這樣的計(jì)算過(guò)程會(huì)比較復(fù)雜,而且容易出錯(cuò)。另外一種做法是可以用JSR 223引入的腳本語(yǔ)言支持,直接把輸入的表達(dá)式當(dāng)做JavaScript或是JavaFX腳本來(lái)執(zhí)行,得到結(jié)果。下面的代碼使用的做法是動(dòng)態(tài)生成Java源代碼并編譯,接著加載Java類來(lái)執(zhí)行并獲取結(jié)果。這種做法完全使用Java來(lái)實(shí)現(xiàn)。
01 private static double calculate(String expr) throws CalculationException {
02 String className = "CalculatorMain";
03 String methodName = "calculate";
04 String source = "public class " + className
05 + " { public static double " + methodName + "() { return " + expr +"; } }";
06 //省略動(dòng)態(tài)編譯Java源代碼的相關(guān)代碼,參見(jiàn)上一節(jié)
07 boolean result = task.call();
08 if (result) {
09 ClassLoader loader = Calculator.class.getClassLoader();
10 try {
11 Class? clazz = loader.loadClass(className);
12 Method method = clazz.getMethod(methodName, new Class?[] {});
13 Object value = method.invoke(null, new Object[] {});
14 return (Double) value;
15 } catch (Exception e) {
16 throw new CalculationException("內(nèi)部錯(cuò)誤。");
17 }
18 } else {
19 throw new CalculationException("錯(cuò)誤的表達(dá)式。");
20 }
21 }
上面的代碼給出了使用動(dòng)態(tài)生成的Java字節(jié)代碼的基本模式,即通過(guò)類加載器來(lái)加載字節(jié)代碼,創(chuàng)建Java類的對(duì)象的實(shí)例,再通過(guò)Java反射API來(lái)調(diào)用對(duì)象中的方法。
Java字節(jié)代碼增強(qiáng)
Java 字節(jié)代碼增強(qiáng)指的是在Java字節(jié)代碼生成之后,對(duì)其進(jìn)行修改,增強(qiáng)其功能。這種做法相當(dāng)于對(duì)應(yīng)用程序的二進(jìn)制文件進(jìn)行修改。在很多Java框架中都可以見(jiàn)到這種實(shí)現(xiàn)方式。Java字節(jié)代碼增強(qiáng)通常與Java源文件中的注解(annotation)一塊使用。注解在Java源代碼中聲明了需要增強(qiáng)的行為及相關(guān)的元數(shù)據(jù),由框架在運(yùn)行時(shí)刻完成對(duì)字節(jié)代碼的增強(qiáng)。Java字節(jié)代碼增強(qiáng)應(yīng)用的場(chǎng)景比較多,一般都集中在減少冗余代碼和對(duì)開(kāi)發(fā)人員屏蔽底層的實(shí)現(xiàn)細(xì)節(jié)上。用過(guò)JavaBeans的人可能對(duì)其中那些必須添加的getter/setter方法感到很繁瑣,并且難以維護(hù)。而通過(guò)字節(jié)代碼增強(qiáng),開(kāi)發(fā)人員只需要聲明Bean中的屬性即可,getter/setter方法可以通過(guò)修改字節(jié)代碼來(lái)自動(dòng)添加。用過(guò)JPA的人,在調(diào)試程序的時(shí)候,會(huì)發(fā)現(xiàn)實(shí)體類中被添加了一些額外的 域和方法。這些域和方法是在運(yùn)行時(shí)刻由JPA的實(shí)現(xiàn)動(dòng)態(tài)添加的。字節(jié)代碼增強(qiáng)在面向方面編程(AOP)的一些實(shí)現(xiàn)中也有使用。