欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

包含java+8代碼的詞條

如何用maven將java8寫的代碼編譯為java6平臺(tái)的

在一般的Java應(yīng)用開發(fā)過程中,開發(fā)人員使用Java的方式比較簡(jiǎn)單。打開慣用的IDE,編寫Java源代碼,再利用IDE提供的功能直接運(yùn)行Java 程序就可以了。這種開發(fā)模式背后的過程是:開發(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通過這種方式來實(shí)現(xiàn)其“編寫一次,到處運(yùn)行(Write once, run anywhere)” 的目標(biāo)。Java類文件中包含的字節(jié)代碼可以被不同平臺(tái)上的JVM所使用。Java字節(jié)代碼不僅可以以文件形式存在于磁盤上,也可以通過網(wǎng)絡(luò)方式來下載,還可以只存在于內(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源文件。

創(chuàng)新互聯(lián)建站,為您提供重慶網(wǎng)站建設(shè)公司成都網(wǎng)站制作、網(wǎng)站營(yíng)銷推廣、網(wǎng)站開發(fā)設(shè)計(jì),對(duì)服務(wù)成都廣告推廣等多個(gè)行業(yè)擁有豐富的網(wǎng)站建設(shè)及推廣經(jīng)驗(yàn)。創(chuàng)新互聯(lián)建站網(wǎng)站建設(shè)公司成立于2013年,提供專業(yè)網(wǎng)站制作報(bào)價(jià)服務(wù),我們深知市場(chǎng)的競(jìng)爭(zhēng)激烈,認(rèn)真對(duì)待每位客戶,為客戶提供賞心悅目的作品。 與客戶共同發(fā)展進(jìn)步,是我們永遠(yuǎn)的責(zé)任!

動(dòng)態(tài)編譯Java源文件

在一般情況下,開發(fā)人員都是在程序運(yùn)行之前就編寫完成了全部的Java源代碼并且成功編譯。對(duì)有些應(yīng)用來說,Java源代碼的內(nèi)容在運(yùn)行時(shí)刻才能確定。這個(gè)時(shí)候就需要?jiǎng)討B(tài)編譯源代碼來生成Java字節(jié)代碼,再由JVM來加載執(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的話,可以通過此API來動(dòng)態(tài)編譯Java代碼。比如下面的代碼用來動(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,不過該工具類只能編譯存放在磁盤上的文件,類似于直接使用javac命令。

另外一個(gè)可用的工具是Eclipse JDT Core提供的編譯器。這是Eclipse Java開發(fā)環(huán)境使用的增量式Java編譯器,支持運(yùn)行和調(diào)試有錯(cuò)誤的代碼。該編譯器也可以單獨(dú)使用。Play框架在內(nèi)部使用了JDT的編譯器來動(dòng)態(tài)編譯Java源代碼。在開發(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)算,比如求出來(3+4)*7-10的值。一般的做法是分析輸入的運(yùn)算表達(dá)式,自己來模擬計(jì)算過程。考慮到括號(hào)的存在和運(yùn)算符的優(yōu)先級(jí)等問題,這樣的計(jì)算過程會(huì)比較復(fù)雜,而且容易出錯(cuò)。另外一種做法是可以用JSR 223引入的腳本語(yǔ)言支持,直接把輸入的表達(dá)式當(dāng)做JavaScript或是JavaFX腳本來執(zhí)行,得到結(jié)果。下面的代碼使用的做法是動(dòng)態(tài)生成Java源代碼并編譯,接著加載Java類來執(zhí)行并獲取結(jié)果。這種做法完全使用Java來實(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é)

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é)代碼的基本模式,即通過類加載器來加載字節(jié)代碼,創(chuàng)建Java類的對(duì)象的實(shí)例,再通過Java反射API來調(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框架中都可以見到這種實(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ì)開發(fā)人員屏蔽底層的實(shí)現(xiàn)細(xì)節(jié)上。用過JavaBeans的人可能對(duì)其中那些必須添加的getter/setter方法感到很繁瑣,并且難以維護(hù)。而通過字節(jié)代碼增強(qiáng),開發(fā)人員只需要聲明Bean中的屬性即可,getter/setter方法可以通過修改字節(jié)代碼來自動(dòng)添加。用過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)中也有使用。

JAVA問題,求 代碼1~代碼8 并解釋下代碼2賦值的問題和代碼4和代碼5的調(diào)用問題

代碼1:int static b;

代碼2:this.a = 10;

代碼3:Ca.b = 10;

代碼4:m1();

代碼5:new Ca().m2();

代碼6:System.out.println(Ca.b);

代碼7:System.out.println(s1.b);

代碼8:System.out.println(s2.b);

代碼2賦值問題,在靜態(tài)的m1()方法中,不能直接調(diào)用非靜態(tài)的變量,可以調(diào)用自身this對(duì)象。

在靜態(tài)的方法中,可以直接調(diào)用靜態(tài)的變量和方法,其它的要實(shí)例后再調(diào)用。希望回答對(duì)你有所幫助。

Java 8 代碼含義

嗯,你說的沒錯(cuò),可以看一下java8的官方文檔

forEach(Consumer? super E action)

Performs the given action for each element of the Iterable

until all elements have been processed or the action throws an

exception.

::

如何用java8的lambda寫一個(gè)求階乘的函數(shù)

作者:青虹

鏈接:

來源:知乎

著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。

代碼如下:

package lamda;

import java.util.function.Function;

import java.util.function.IntToDoubleFunction;

public class Recursive {

public static void main(String[] args) {

IntToDoubleFunction[] foo = {null};

foo[0] = x - (x == 0) ? 1 : x * foo[0].applyAsDouble(x - 1);

System.out.println(foo[0].applyAsDouble(10));

// fuck generics

FunctionInteger, Integer[] fuckRecusive = new Function[1];

fuckRecusive[0] = (x) - x == 1 ? 1 : x * (fuckRecusive[0]).apply(x - 1);

System.out.println(fuckRecusive[0].apply(10));

}

}

java8 lambda 表達(dá)式是個(gè)什么

為了支持函數(shù)式編程,Java 8引入了Lambda表達(dá)式.

在Java 8中采用的是內(nèi)部類來實(shí)現(xiàn)Lambda表達(dá)式.具體實(shí)現(xiàn)代碼,可以通過debug看, 同時(shí)通過字節(jié)碼查看工具及反編譯工具來驗(yàn)證.

自從lambda表達(dá)式成為Java語(yǔ)言的一部分之后,Java集合(Collections)API就面臨著大幅變化。而JSR 355(規(guī)定了Java lambda表達(dá)式的標(biāo)準(zhǔn))的正式啟用更是使得Java集合API變的過時(shí)不堪。

盡管我們可以從頭實(shí)現(xiàn)一個(gè)新的集合框架(比如“Collection II”),但取代現(xiàn)有的集合框架是一項(xiàng)非常艱難的工作,因?yàn)榧辖涌跐B透了Java生態(tài)系統(tǒng)的每個(gè)角落,將它們一一換成新類庫(kù)需要相當(dāng)長(zhǎng)的時(shí)間。因此,我們決定采取演化的策略(而非推倒重來)以改進(jìn)集合API: 為現(xiàn)有的接口(例如Collection,List和Stream)增加擴(kuò)展方法;

在類庫(kù)中增加新的流(stream,即java.util.stream.Stream)抽象以便進(jìn)行聚集(aggregation)操作;

改造現(xiàn)有的類型使之可以提供流視圖(stream view);

改造現(xiàn)有的類型使之可以容易的使用新的編程模式,這樣用戶就不必拋棄使用以久的類庫(kù),例如ArrayList和HashMap

(當(dāng)然這并不是說集合API會(huì)常駐永存,畢竟集合API在設(shè)計(jì)之初并沒有考慮到lambda表達(dá)式。我們可能會(huì)在未來的JDK中添加一個(gè)更現(xiàn)代的集合類庫(kù))。

除了上面的改進(jìn),還有一項(xiàng)重要工作就是提供更加易用的并行(Parallelism)庫(kù)。盡管Java平臺(tái)已經(jīng)對(duì)并行和并發(fā)提供了強(qiáng)有力的支持,然而開發(fā)者在實(shí)際工作(將串行代碼并行化)中仍然會(huì)碰到很多問題。因此,我們希望Java類庫(kù)能夠既便于編寫串行代碼也便于編寫并行代碼,因此我們把編程的重點(diǎn)從具體執(zhí)行細(xì)節(jié)(how computation should be formed)轉(zhuǎn)移到抽象執(zhí)行步驟(what computation should be perfomed)。

網(wǎng)頁(yè)題目:包含java+8代碼的詞條
URL網(wǎng)址:http://www.chinadenli.net/article32/doosgpc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)網(wǎng)站設(shè)計(jì)網(wǎng)站收錄營(yíng)銷型網(wǎng)站建設(shè)移動(dòng)網(wǎng)站建設(shè)用戶體驗(yàn)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名