<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          超詳細(xì) Java 15 新功能介紹

          共 10652字,需瀏覽 22分鐘

           ·

          2021-08-20 22:31

          Java 15 在 2020 年 9 月發(fā)布,雖然不是長(zhǎng)久支持版本,但是也帶來(lái)了 14 個(gè)新功能,這些新功能中有不少是十分實(shí)用的。

          Java 15 官方下載:https://jdk.java.net/archive/

          Java 15 官方文檔:https://openjdk.java.net/projects/jdk/15/

          Java 15 新功能:

          JEP描述
          JEP 339愛(ài)德華曲線(xiàn)算法(EdDSA)
          JEP 360Sealed Classes(密封類(lèi))預(yù)覽
          JEP 371Hidden Classes(隱藏類(lèi))
          JEP 372移除 Nashorn JavaScript 引擎
          JEP 373重新實(shí)現(xiàn) DatagramSocket APII
          JEP 374禁用和廢棄偏向鎖(Biased Locking)
          JEP 375instanceof 類(lèi)型匹配  (二次預(yù)覽)
          JEP 377ZGC: 可擴(kuò)展低延遲垃圾收集器(正式發(fā)布)
          JEP 378文本塊
          JEP 379Shenandoah: 低停頓時(shí)間的垃圾收集器
          JEP 381刪除 Solaris 和 SPARC 端口
          JEP 383外部?jī)?nèi)存訪(fǎng)問(wèn) API(第二個(gè)孵化器))
          JEP 384Records (二次預(yù)覽)
          JEP 385廢棄 RMI 激活機(jī)制

          JEP339 愛(ài)德華曲線(xiàn)算法(EdDSA)

          Java 15 中增加了一個(gè)新的密碼學(xué)算法,愛(ài)德華曲線(xiàn)算法(EdDSA)簽名算法。它是由 Schnorr 算法發(fā)展而來(lái),在 RFC8032 中被定義實(shí)現(xiàn)。

          package com.wdbyte;

          import java.nio.charset.StandardCharsets;
          import java.security.InvalidKeyException;
          import java.security.KeyPair;
          import java.security.KeyPairGenerator;
          import java.security.NoSuchAlgorithmException;
          import java.security.Signature;
          import java.security.SignatureException;
          import java.util.Base64;

          public class JEP339 {

              public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeyException, SignatureException {
                  KeyPairGenerator kpg = KeyPairGenerator.getInstance("Ed25519");
                  KeyPair kp = kpg.generateKeyPair();
                  byte[] msg = "www.wdbyte.com".getBytes(StandardCharsets.UTF_8);
                  Signature sig = Signature.getInstance("Ed25519");
                  sig.initSign(kp.getPrivate());
                  sig.update(msg);
                  byte[] s = sig.sign();
                  System.out.println(Base64.getEncoder().encodeToString(s));
              }
          }

          輸出結(jié)果:

          VXlpxapU+LSWjVQ0QNJvdpUh6VI6PjSwOQ2pHu65bCfnLR13OyWKunlc9rc+7SMxCh2Mnqf7TmC/iOG8oimbAw==

          JEP360:Sealed Classes(密封類(lèi))預(yù)覽

          我們都知道,在 Java 中如果想讓一個(gè)類(lèi)不能被繼承和修改,這時(shí)我們應(yīng)該使用 final 關(guān)鍵字對(duì)類(lèi)進(jìn)行修飾。不過(guò)這種要么可以繼承,要么不能繼承的機(jī)制不夠靈活,有些時(shí)候我們可能想讓某個(gè)類(lèi)可以被某些類(lèi)型繼承,但是又不能隨意繼承,是做不到的。Java 15 嘗試解決這個(gè)問(wèn)題,引入了 sealed 類(lèi),被 sealed 修飾的類(lèi)可以指定子類(lèi)。這樣這個(gè)類(lèi)就只能被指定的類(lèi)繼承。

          而且 sealed 修飾的類(lèi)的機(jī)制具有傳遞性,它的子類(lèi)必須使用指定的關(guān)鍵字進(jìn)行修飾,且只能是 finalsealednon-sealed  三者之一。

          示例:犬類(lèi)(Dog)只能被牧羊犬(Collie)和田園犬(TuGou)繼承,使用 sealed 關(guān)鍵字。

          package com.wdbyte;

          public  sealed interface Dog permits CollieTuGou {
              //...
          }

          牧羊犬(Collie)只能被邊境牧羊犬(BorderCollie)繼承。

          package com.wdbyte;

          /**
           * 牧羊犬
           * @author www.wdbyte.com
           */

          public sealed class Collie implements Dog permits BorderCollie {

          }

          邊境牧羊犬(BorderCollie)不能被繼承,使用 final 關(guān)鍵字。

          package com.wdbyte;

          /**
           *
           * @author www.wdbyte.com
           */

          public final class BorderCollie extends Collie{
          }

          田園犬(ToGou)可以被任意繼承,使用 non-sealed 關(guān)鍵字。

          package com.wdbyte;

          /**
           * @author niulang
           */

          public non-sealed class TuGou implements Dog {
          }

          JEP371:Hidden Classes(隱藏類(lèi))

          這個(gè)特性讓開(kāi)發(fā)者可以引入一個(gè)無(wú)法被其他地方發(fā)現(xiàn)使用,且類(lèi)的生命周期有限的類(lèi)。這對(duì)運(yùn)行時(shí)動(dòng)態(tài)生成類(lèi)的使用方式十分有利,可以減少內(nèi)存占用,下面是一個(gè)使用示例。

          package com.wdbyte;

          public class JEP371Test {
              public static String lookup() {
                return "www.wdbyte.com";
              }
          }

          把類(lèi) JEP371Test 編譯后的 Class 轉(zhuǎn)換成 Base64,然后使用 Java 15 新特性加載調(diào)用類(lèi)中的 lookup 方法。

          package com.wdbyte;

          import java.lang.invoke.MethodHandle;
          import java.lang.invoke.MethodHandles;
          import java.lang.invoke.MethodType;
          import java.util.Base64;

          /**
           * @author www.wdbyte.com
           */

          public class JEP371 {

              private static String CLASS_INFO = "yv66vgAAADQAFAoAAgADBwAEDAAFAAYBABBqYXZhL2xhbmcvT2JqZWN0AQAGPGluaXQ+AQADKClWCAAIAQAOd3d3LndkYnl0ZS5jb20HAAoBABVjb20vd2RieXRlL0pFUDM3MVRlc3QBAARDb2RlAQAPTGluZU51bWJlclRhYmxlAQASTG9jYWxWYXJpYWJsZVRhYmxlAQAEdGhpcwEAF0xjb20vd2RieXRlL0pFUDM3MVRlc3Q7AQAGbG9va3VwAQAUKClMamF2YS9sYW5nL1N0cmluZzsBAApTb3VyY2VGaWxlAQAPSkVQMzcxVGVzdC5qYXZhACEACQACAAAAAAACAAEABQAGAAEACwAAAC8AAQABAAAABSq3AAGxAAAAAgAMAAAABgABAAAAAwANAAAADAABAAAABQAOAA8AAAAJABAAEQABAAsAAAAbAAEAAAAAAAMSB7AAAAABAAwAAAAGAAEAAAAEAAEAEgAAAAIAEw==";

              public static void main(String[] args) throws Throwable {
                  byte[] classInBytes = Base64.getDecoder().decode(CLASS_INFO);
                  Class<?> proxy = MethodHandles.lookup()
                      .defineHiddenClass(classInBytes, true, MethodHandles.Lookup.ClassOption.NESTMATE)
                      .lookupClass();

                  System.out.println(proxy.getName());
                  MethodHandle mh = MethodHandles.lookup().findStatic(proxy, "lookup", MethodType.methodType(String.class));
                  String result = (String) mh.invokeExact();
                  System.out.println(result);
              }
          }

          輸出結(jié)果:

          com.wdbyte.JEP371Test/0x0000000800c01800
          www.wdbyte.com

          JEP372:移除 Nashorn JavaScript 引擎

          Nashorn JavaScript 引擎在 Java 8 中被引入,在 Java 11 中被標(biāo)記為廢棄。由于 ECMAScript 語(yǔ)言發(fā)展很快,維護(hù)  Nashorn JavaScript 的成本過(guò)于高昂,在 Java 15 中被徹底刪除。

          擴(kuò)展閱讀:Nashorn JavaScript Engine,Deprecate the Nashorn JavaScript Engine

          JEP373:重新實(shí)現(xiàn) DatagramSocket API

          Java 13 中重新實(shí)現(xiàn)了舊的 Socket API,在介紹 Java 13 時(shí)還有一部分做了這方面的介紹。

          現(xiàn)在,Java 15 重新實(shí)現(xiàn)了遺留的 DatagramSocket

          擴(kuò)展閱讀:Java 13 新功能介紹

          JEP374:禁用和廢棄偏向鎖(Biased Locking)

          在之前,JVM 在處理同步操作,如使用 synchronized 同步時(shí),有一套鎖的升級(jí)機(jī)制,其中有一個(gè)鎖機(jī)制就是偏向鎖。然而通過(guò)目前的 Java 開(kāi)發(fā)環(huán)境來(lái)看,使用這些被 synchronized 同步的類(lèi)的機(jī)會(huì)并不多,如開(kāi)發(fā)者更喜歡使用 HashMap 或者 ArrayList 而非 HashTableVector

          即使換個(gè)角度,當(dāng)初使用偏向鎖是為了提高性能,如今看來(lái)性能提升的程度和使用次數(shù)都不太有用。而偏向鎖的引入增加了 JVM 的復(fù)雜性。

          所以現(xiàn)在偏向鎖被默認(rèn)禁用,在不久的將來(lái)將會(huì)徹底刪除,對(duì)于 Java 15,我們?nèi)匀豢梢允褂?code style="font-size: 14px;overflow-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(218, 16, 57);">-XX:+UseBiasedLocking  啟用偏向鎖定,但它會(huì)提示 這是一個(gè)已棄用的 API。

          JEP375:instanceof 類(lèi)型匹配  (二次預(yù)覽)

          instanceof 類(lèi)型匹配在 Java 14 中已經(jīng)改進(jìn),這次僅僅再次預(yù)覽,沒(méi)有任何改動(dòng),用于接受更多的使用反饋。這個(gè)特性在 Java 16 中成為正式特性。

          在之前,使用 instanceof 進(jìn)行類(lèi)型判斷之后,需要進(jìn)行對(duì)象類(lèi)型轉(zhuǎn)換后才能使用。

          package com.wdbyte;

          import java.util.ArrayList;
          import java.util.List;

          public class Java14BeaforInstanceof {

              public static void main(String[] args) {
                  Object obj = new ArrayList<>();
                  if (obj instanceof ArrayList) {
                      ArrayList list = (ArrayList)obj;
                      list.add("www.wdbyte.com");
                  }
                  System.out.println(obj);
              }
          }

          而在 Java 14 中,可以在判斷類(lèi)型時(shí)指定變量名稱(chēng)進(jìn)行類(lèi)型轉(zhuǎn)換,方便了使用。

          package com.wdbyte;

          import java.util.ArrayList;

          public class Java14Instanceof {
              public static void main(String[] args) {
                  Object obj = new ArrayList<>();
                  if (obj instanceof ArrayList list) {
                      list.add("www.wdbyte.com");
                  }
                  System.out.println(obj);
              }
          }

          可以看到,在使用 instanceof 判斷類(lèi)型成立后,會(huì)自動(dòng)強(qiáng)制轉(zhuǎn)換類(lèi)型為指定類(lèi)型。

          輸出結(jié)果:

          [www.wdbyte.com]

          擴(kuò)展閱讀:Java 14 新功能介紹

          JEP377:ZGC: 可擴(kuò)展低延遲垃圾收集器(正式發(fā)布)

          ZGC 垃圾收集器在 Java 11 中被引入,但是因?yàn)槭占鞯膹?fù)雜性,當(dāng)初決定逐漸引入。然后不斷的聽(tīng)取用戶(hù)的反饋建議修復(fù)問(wèn)題。而現(xiàn)在,已經(jīng)很久沒(méi)有收到用戶(hù)的問(wèn)題反饋了,ZGC 是時(shí)候投入正式使用階段了。所以在 Java 15 中 ZGC 正式發(fā)布,可以使用下面的參數(shù)啟用 ZGC。

          $ java -XX:+UseZGC className

          JEP378:文本塊

          文本塊在 Java 12 JEP 326 原始字符串文字 中引入,在 Java 13 JEP 355:文本塊(預(yù)覽) 中開(kāi)始預(yù)覽,在 Java 14 JEP 368:文本塊(第二次預(yù)覽),而現(xiàn)在,在 Java 15 ,文本塊是正式的功能特性了。

          String content = """
                  {
                      "
          upperSummary": null,\
                      "
          sensitiveTypeList": null,
                      "
          gmtModified": "2011-08-05\s10:50:09",
                  }
                   "
          "";
          System.out.println(content);

          擴(kuò)展閱讀:Java 14 新功能介紹- JEP368 文本塊

          JEP379:Shenandoah: 低停頓時(shí)間的垃圾收集器

          Shenandoah 垃圾收集器在 Java 12 中開(kāi)始引入,Java 15 中成為了正式功能的一部分,可以使用下面的參數(shù)啟用 Shenandoah 垃圾收集器。

          java -XX:+UseShenandoahGC

          但是 openJDK 15 中默認(rèn)是沒(méi)有 Shenandoah 收集器,想要使用此功能可以下載 AdoptOpenJDK。

          為什么 openJDK 中沒(méi)有 Shenandoah 垃圾收集器?

          Shenandoah 是一個(gè)高性能、低暫停時(shí)間的垃圾收集器,它是 Red Hat 主導(dǎo)的項(xiàng)目。當(dāng) Red Hat 第一次提議將 Shenandoah 貢獻(xiàn)給 OpenJDK 時(shí),Oracle 明確表示不想支持它,OpenJDK 作為一個(gè)免費(fèi)軟件,不想支持 Red Hat 的 Shenandoah 完全沒(méi)有問(wèn)題。

          最后 Red Hat 選擇和 Oracle 合作設(shè)計(jì)一個(gè)真正干凈的可插拔垃圾收集器接口,允許任何人輕松選擇垃圾收集器以包含在他們的構(gòu)建中。最終 Shenandoah 進(jìn)入了 JDK 12,但是沒(méi)有構(gòu)建進(jìn) OpenJDK。

          JEP384:Records(二次預(yù)覽)

          在 Java 14 中引入了 Record 類(lèi),Java 15 中對(duì) Record 進(jìn)行了增強(qiáng)。使它可以支持密封類(lèi)型、Record 注解以及相關(guān)的反射 API 等。

          示例:Record 支持密封(sealed)類(lèi)型。

          package com.wdbyte;

          /**
           * @author www.wdbyte.com
           */

          public sealed interface DataBase permits DataBaseSelectDataBaseUpdate {
          }

          final record DataBaseSelect(@Deprecated String table, String sql) implements DataBase {
          }

          final record DataBaseUpdate() implements DataBase {
          }

          java.lang.Class 增加了兩個(gè)公共方法用于獲取 Record 類(lèi)信息:

          1. RecordComponent[] getRecordComponents()

          2. boolean isRecord()

          其他更新

          JEP 381:刪除 Solaris 和 SPARC 端口

          Java 14 JEP 362棄用了 Solaris/SPARC、Solaris/x64 和 Linux/SPARC 端口,現(xiàn)在它在 Java 15 中被正式刪除。

          JEP 383:外部?jī)?nèi)存訪(fǎng)問(wèn) API(第二個(gè)孵化器)

          JEP 385:廢棄 RMI 激活機(jī)制

          只是廢棄 RMI 激活機(jī)制,不影響 RMI 其他功能。

          參考

          1. https://openjdk.java.net/projects/jdk/15/
          2. https://docs.oracle.com/en/java/javase/14/docs/specs/rmi/activation.html
          3. https://mkyong.com/java/what-is-new-in-java-15/


          ---- END ----

          Hello world : ) 這篇文章就到這里了,我是阿朗,一個(gè)一線(xiàn)技術(shù)工具人。點(diǎn)贊在看,動(dòng)力無(wú)限。

          點(diǎn)贊的個(gè)個(gè)都是人才,不僅長(zhǎng)得帥氣好看,說(shuō)話(huà)還好聽(tīng)。


          瀏覽 71
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产美女日逼 | 成人第一色| 大香蕉在线视频看精品 | 亚洲做爱在线 | 六月婷婷天天操夜夜爽视频 |