1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        超詳細 Java 15 新功能介紹

        共 10652字,需瀏覽 22分鐘

         ·

        2021-08-20 22:31

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

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

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

        Java 15 新功能:

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

        JEP339 愛德華曲線算法(EdDSA)

        Java 15 中增加了一個新的密碼學(xué)算法,愛德華曲線算法(EdDSA)簽名算法。它是由 Schnorr 算法發(fā)展而來,在 RFC8032 中被定義實現(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(密封類)預(yù)覽

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

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

        示例:犬類(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(隱藏類)

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

        package com.wdbyte;

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

        把類 JEP371Test 編譯后的 Class 轉(zhuǎn)換成 Base64,然后使用 Java 15 新特性加載調(diào)用類中的 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 語言發(fā)展很快,維護  Nashorn JavaScript 的成本過于高昂,在 Java 15 中被徹底刪除。

        擴展閱讀:Nashorn JavaScript Engine,Deprecate the Nashorn JavaScript Engine

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

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

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

        擴展閱讀:Java 13 新功能介紹

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

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

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

        所以現(xiàn)在偏向鎖被默認禁用,在不久的將來將會徹底刪除,對于 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  啟用偏向鎖定,但它會提示 這是一個已棄用的 API。

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

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

        在之前,使用 instanceof 進行類型判斷之后,需要進行對象類型轉(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 中,可以在判斷類型時指定變量名稱進行類型轉(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 判斷類型成立后,會自動強制轉(zhuǎn)換類型為指定類型。

        輸出結(jié)果:

        [www.wdbyte.com]

        擴展閱讀:Java 14 新功能介紹

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

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

        $ java -XX:+UseZGC className

        JEP378:文本塊

        文本塊在 Java 12 JEP 326 原始字符串文字 中引入,在 Java 13 JEP 355:文本塊(預(yù)覽) 中開始預(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);

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

        JEP379:Shenandoah: 低停頓時間的垃圾收集器

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

        java -XX:+UseShenandoahGC

        但是 openJDK 15 中默認是沒有 Shenandoah 收集器,想要使用此功能可以下載 AdoptOpenJDK。

        為什么 openJDK 中沒有 Shenandoah 垃圾收集器?

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

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

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

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

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

        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 增加了兩個公共方法用于獲取 Record 類信息:

        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:外部內(nèi)存訪問 API(第二個孵化器)

        JEP 385:廢棄 RMI 激活機制

        只是廢棄 RMI 激活機制,不影響 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 : ) 這篇文章就到這里了,我是阿朗,一個一線技術(shù)工具人。點贊在看,動力無限。

        點贊的個個都是人才,不僅長得帥氣好看,說話還好聽。


        瀏覽 71
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            在线成人免费观看视频 | 啊~我是sao货快cao我视频 | 亚洲一区在线免费观看 | 国产老熟女性爱视频 | 好涨好爽好大视频免费 | 91麻豆成人精品国产 | 日产精品久久久久 | 美女扒开尿口让男人爽 | 扒开腿灌牛奶调教小说 | 欧美肏屄视频在线观看 |