当前位置: 首页 > 后端技术 > Java

Java 16 新功能介绍

时间:2023-04-01 22:44:15 Java

Java16新特性介绍Helloworld:)微信搜索“程序猿艾伦”。本文已收录在Github.com/niumoo/JavaNotes和ProgrammerAlanBlog,里面有很多知识点和系列文章。Java16于2021年3月16日正式发布,不是长期支持版本。本次更新并没有带来太多语法上的变化,但也带来了很多新的实用功能。OpenJDKJava16下载:https://jdk.java.net/archive/OpenJDKJava16文档:https://openjdk.java.net/proj...版本新特性可以点击浏览。1.JEP347:启用C++14语言特性此更新与Java开发人员关系不大。JEP347允许在JDK的C++源代码中使用C++14语言特性,并给出了HotSpot代码中可以使用哪些特性的具体描述。延伸阅读:启用C++14种语言特性2.JEP357:从Mercurial迁移到Git在此之前,OpenJDK的源代码是使用版本管理工具Mercurial进行管理的,你也可以在http://hg.openjdk.java找到它。net/查看OpenJDK的源码历史。但是现在迁移到了GIt,主要原因是:Mercurial生成的版本控制元数据太大。与Mercurial相关的开发工具相对较少,而Git已经无缝集成在几乎所有的主流IDE中。无论是自建托管还是服务托管,与Mercurial相关的服务都比较少。为了优雅地迁移到Git,OpenJDK做了如下操作。将所有单一存储库OpenJDK项目从Mercurial迁移到Git。保留所有版本控制历史记录,包括标签。根据Git最佳实践重新格式化提交消息。创建了一个在Mercurial和Git哈希之间进行转换的工具。进一步阅读:从Mercurial迁移到Git3。JEP369:迁移到GitHub和JEP357从Mercurial到Git的变化是一致的。将版本管理迁移到Git后,我??选择将OpenJDK社区的Git仓库托管在GitHub上。但是,仅迁移JDK11及更高版本的JDK。4.JEP376:ZGC并发线程堆栈处理此更改将ZGC线程堆栈处理从安全点移至并发阶段。如果您忘记了安全点是什么,这里有一个复习。我们都知道,以前需要GC的时候,为了进行垃圾回收,所有的线程都需要挂起,我们在这个挂起的时间里调用了StopTheWorld。为了实现STW操作,JVM需要为每个线程选择一个停止运行的点。这个点称为安全点(Safepoints)。进一步阅读:JEP376:ZGC并发线程堆栈处理5.JEP380:UnixDomainSocketChannel添加UnixDomainSocketAddress.java类以支持UnixDomainSocketChannel。将Unix域套接字添加到SocketChannel和ServerSocketChannelAPI。添加枚举信息java.net.StandardProtocolFamily.UNIX。6.JEP386:移植AlpineLinuxApineLinux是一个独立的、非商业的Linux发行版,它非常小,一个容器只需要不超过8MB的空间,最小安装到磁盘只需要大约130MB的存储空间,并且很简单,兼顾安全。该提案将JDK移植到AplineLinux。由于AplineLinux是基于musllib的轻量级Linux发行版,因此其他在x64和AArch64架构上使用musllib的Linux发行版也适用。进一步阅读:JEP386:AlpineLinuxPort7。JEP387:BetterMetaspace自从引入Metaspace以来,根据反馈,Metaspace经常占用过多的堆外内存,造成内存浪费,现在将未使用的HotSpot类-元空间内存归还给操作系统,从而减少Metaspace足迹,并优化元空间代码以降低后续维护成本。8.JEP388:移植Windows/AArch64将JDK移植到Windows/AArch64架构,Windows/AArch64已经是终端用户市场的热门需求。9.JEP389:ExternalConnectorAPI(incubating)该提案允许Java代码调用用其他语言(如C、C++)编写的编译机器代码,取代之前的JNI形式。但这仍然是一个孵化特性,你需要在运行时添加--add-modulesjdk.incubator.foreign参数来编译运行Java代码。下面是一个调用C语言函数方法,然后输出运行结果的例子。编写一个打印“hellowww.wdbyte.com”的C函数。#includevoidprintHello(){printf("hellowww.wdbyte.com\n");}编译以上代码输出到共享库hello.so$gcc-c-fPIChello.c$gcc-shared-ohello.sohello.o$lltotal128-rw-r--r--1darcystaff76B102819:46hello.c-rw-r--r--1darcystaff776B102819:46hello.o-rwxr-xr-x1darcystaff48K102819:47hello.so写一段Java代码,调用hello.so的printHello方法。导入jdk.incubator.foreign.CLinker;导入jdk.incubator.foreign.FunctionDescriptor;导入jdk.incubator.foreign.LibraryLookup;导入java.lang.invoke.MethodHandle;导入java.lang.invoke.MethodType;导入java.nio。file.Path;importjava.util.Optional;publicclassJEP389{publicstaticvoidmain(String[]args)throwsThrowable{Pathpath=Path.of("/Users/darcy/git/java-core/java-16/src/com/wdbyte/hello.so");LibraryLookuplibraryLookup=LibraryLookup.ofPath(path);可选optionalSymbol=libraryLookup.lookup("printHello");如果(optionalSymbol.isPresent()){LibraryLookup.Symbolsymbol=optionalSymbol.get();FunctionDescriptorfunctionDescriptor=FunctionDescriptor.ofVoid();MethodTypemethodType=MethodType.methodType(Void.TYPE);MethodHandlemethodHandle=CLinker.getInstance().downcallHandle(符号.地址(),methodType、函数描述符);methodHandle.invokeExact();}}}Java代码编译$javac--add-modulesjdk.incubator.foreignJEP389.java警告:使用孵化模块:jdk.incubator.foreign1警告Java代码执行。$java--add-modulesjdk.incubator.foreign-Dforeign.restricted=permitJEP389.java警告:使用孵化模块:jdk.incubator.foreign警告:使用孵化模块:jdk.incubator.foreign1warninghellowww.wdbyte.com进一步阅读:JEP389:ExternalLinkerAPI(Incubator)10.JEP390:WarningsforValue-BasedClasses添加注解标识当前是基于值的类,比如Java8引入的防止空指针的Optional类,现在标有注释。@jdk.internal.ValueBasedpublicfinalclassOptional{//...}延伸阅读:基于值的类的警告11.JEP392:打包工具在Java14中,JEP343引入了打包工具,命令为jpackage,在Java14新特性一文中也有介绍:使用jpackage命令将JAR包打包成不同操作系统支持的软件格式。jpackage--namemyapp--inputlib--main-jarmain.jar--main-classmyapp.Main常见平台格式如下:Linux:deb和rpmmacOS:pkg和dmgWindows:msi和exe注意jpackage做不支持交叉编译,也就是说不能在windows平台上打包成macOS或者Linux系统的软件格式。在Java15中,孵化仍在继续,现在在Java16中,它终于成为一个正式功能。下面是将一个简单的JavaSwing程序打包成当前操作系统支持的软件格式,然后安装到当前电脑上的例子。编写Java代码frame.setMinimumSize(newDimension(800,600));frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);JLabellblText=newJLabel("HelloWorld!",SwingConstants.CENTER);frame.getContentPane().add(lblText);框架.pack();frame.setVisible(true);}}编译完成后,创建一个JAR文件。$javacJEP392.java$javaJEP392.java$jarcvfJEP392.jarJEP392.class将生成的JEP392.jar打包成与当前平台匹配的包。$~/develop/jdk-16.0.1.jdk/Contents/Home/bin/jpackage-i。-nJEP392--main-jarhello.jar--main-classJEP392$ll-rw-r--r--@1darcystaff50M102820:34JEP392-1.0.dmg-rw-r--r--1达西员工864B102820:22JEP392.class-rw-r--r--1达西员工1.0K102820:30JEP392.jar-rw-r--r--1达西员工588B102820:22JEP392-1.0.dmg在JEP392.javaall(我用的是MacOS,所以格式是dmg)之后显示的就是打包后的结果。双击这个文件后,就可以像mac软件一样安装了。其他平台类似。安装后,可以在启动台上启动。不同的系统有不同的安装位置:Linux:/optMacOS:/ApplicationsWindows:C:\ProgramFiles\延伸阅读:JEP392:PackagingTool12.JEP393:ExternalMemoryAccess(ThirdIncubation)本提案旨在引入新的API,以允许Java程序安全高效地访问Java堆外的内存。早在Java14就提出了相关提案,在Java15重新孵化,现在又在Java16中提出。该提案的目标如下:通用性:单个API应该能够操作各种外部内存(如本机内存、持久内存、堆内存等)。安全性:无论操作什么样的内存,API都不应该违反JVM的安全性。控制:您可以自由选择释放内存的方式(显式、隐式等)。Available:如果需要访问外存,API应该是sun.misc.Unsafa。延伸阅读:外部内存访问13.JEP394:instanceof模式匹配改进instanceof已经在J??ava14中提出,并在Java15中继续预览,现在,成为Java16中的正式特性。之前,使用instanceof需要以下操作:if(objinstanceofString){Strings=(String)obj;//grr......}冗余类型转换,现在:if(objinstanceofStrings){//让模式匹配完成工作!...}延伸阅读:Java14新特性介绍——instanceof14。JEP395:RecordsRecord已经成为Java16的正式功能,下面是引入Java14时对Record的介绍,record是一个全新的类型。它本质上是最后一堂课。同时对所有属性进行final修改。它会自动编译publicgethashcode、equals、toString等方法,减少代码编写量。示例:编写一个Dog记录类,定义名称和年龄属性。包com.wdbyte;publicrecordDog(Stringname,Integerage){}记录的使用。packagecom.wdbyte;publicclassJava14Record{publicstaticvoidmain(String[]args){Dogdog1=newDog("ShepherdDog",1);Dogdog2=newDog("田园犬",2);Dogdog3=newDog("哈士奇",3);System.out.println(dog1);System.out.println(dog2);System.out.println(dog3);}}输出结果:Dog[name=ShepherdDog,age=1]Dog[name=PascalDog,age=2]Dog[name=Husky,age=3]该函数在Java15预览,Java16正式发布.15.JEP396:JDK内部默认强封装Java9JEP261引入了--illegal-access选项来控制内部API访问和JDK打包。此JEP将--illegal-access选项的默认模式从允许更改为拒绝。通过此更改,JDK的内部包和API(关键内部API除外)将不再默认打开。这个JEP的动机是防止第三方库、框架和工具使用JDK的内部API和包,从而提高安全性。16.JEP397:SealedClasses(密封类)预览SealedClasses再次预览。相关功能在Java15新特性介绍文章中已有介绍,并给出了详细的使用演示,此处不再赘述。下面引用一段话:我们都知道,在Java中,如果我们想让一个类不被继承和修改,那么我们应该使用final关键字来修饰这个类。但是,这种要么继承要么不继承的机??制不够灵活。有时候我们可能希望一个类被某些类型继承,但是不能随意继承,这是不可能的。Java15试图通过引入密封类来解决这个问题,密封修饰的类可以指定子类。这样这个类只能被指定的类继承。而且sealed修饰类的机制是传递性的,其子类必须用指定的关键字修饰,并且只能是final、sealed、non-sealed其中之一。延伸阅读:Java15新特性介绍https://openjdk.java.net/proj...https://docs.oracle.com/en/ja...<完>Helloworld:)这是阿郎,一个一线技术工具人,认真写文章。喜欢的人都是有才华的,不仅长得帅气,说话也好听。文章持续更新中,可以关注公众号“程序阿龙”或访问“程序阿龙博客](https://www.wdbyte.com)”。回复【资料】里面有我准备的各种系列的知识点和必读书籍。本文已收录于Github.com/niumoo/JavaNotes。知识点多,系列文章多。欢迎来到星空。

最新推荐
猜你喜欢