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

超详细 Java 15 新功能介绍

时间:2023-04-01 16:11:31 Java

超详细Java15新特性介绍微信搜索“程序猿阿浪”,认真写文章。本文已收录在Github.com/niumoo/JavaNotes和UnreadCodeBlog,有很多知识点和系列文章。Java15于2020年9月发布,虽然不是长期支持版本,但也带来了14个新特性,其中有很多非常实用。Java15官方下载:https://jdk.java.net/archive/Java15官方文档:https://openjdk.java.net/proj...Java15新特性:JEP说明JEP339EdwardCurveAlgorithm(EdDSA)JEP360SealedClasses(密封类)预览JEP371隐藏类(HiddenClasses)JEP372RemoveNashornJavaScriptEngineJEP373ReimplementDatagramSocketAPIIJEP374DisableandDiscardBiasedLockingJEP375instanceoftype匹配(二次预览)JEP377ZGC:可扩展的低延迟垃圾收集器(一般发布)JEP378文本块JEP379Shenandoah:低暂停时间垃圾收集器JEP381删除Solaris和SPARC端口JEP383外部内存访问API(第二个孵化器))JEP384Records(二次预览)JEP385废弃RMI激活机制1.JEP339爱德华曲线算法(EdDSA)Java15增加了一种新的密码算法,爱德华曲线算法(EdDSA)签名算法。它由Schnorr算法发展而来,在RFC8032中定义和实现。包com.wdbyte;导入java.nio.charset.StandardCharsets;导入java.security.InvalidKeyException;导入java.security.KeyPair;导入java.security.KeyPairGenerator;导入java.security.NoSuchAlgorithmException;导入java.security.Signature;导入java.security.SignatureException;importjava.util.Base64;publicclassJEP339{publicstaticvoidmain(String[]args)throwsNoSuchAlgorithmException,InvalidKeyException,SignatureException{KeyPairGeneratorkpg=KeyPairGenerator.getInstance("Ed25519");KeyPairkp=kpg.generateKeyPair();byte[]msg="www.wdbyte.com".getBytes(StandardCharsets.UTF_8);签名sig=Signature.getInstance("Ed25519");sig.initSign(kp.getPrivate());信号更新(味精);byte[]s=sig.sign();System.out.println(Base64.getEncoder().encodeToString(s));}}输出结果:VXlpxapU+LSWjVQ0QNJvdpUh6VI6PjSwOQ2pHu65bCfnLR13OyWKunlc9rc+7SMxCh2Mnqf7TmC/iOG8oimbAw==2.JEP360:大海ledClasses(密封类)预览我们都知道在Java中如果想要一个类不被继承和修改,那么我们应该使用final关键字来修饰这个类。但是这种要么可以继承要么不能继承的机制不够灵活,有时候我们可能希望一个类被某些类型继承,但是又不能随意继承,这是不可能的。Java15试图通过引入密封类来解决这个问题,密封修饰的类可以指定子类。这样这个类只能被指定的类继承。而且sealed修饰类的机制是传递性的,其子类必须用指定的关键字修饰,并且只能是final、sealed、non-sealed其中之一。例子:Dog只能被Collie和TuGou继承,使用sealed关键字。包com.wdbyte;publicsealedinterfaceDogpermitsCollie,TuGou{//...}Collie只能由BorderCollie继承。packagecom.wdbyte;/***Collie*@authorwww.wdbyte.com*/publicsealedclassCollieimplementsDogpermitsBorderCollie{}边境牧羊犬(BorderCollie)不能被继承,使用final关键字。packagecom.wdbyte;/****@authorwww.wdbyte.com*/publicfinalclassBorderCollieextendsCollie{}ToGou可以任意继承,使用非sealed关键字。packagecom.wdbyte;/***@authorniulang*/publicnon-sealedclassTuGouimplementsDog{}3.JEP371:HiddenClasses(隐藏类)这个特性允许开发者引入一个在别处找不到和使用的类。而且类的生命周期是有限的。这对于在运行时使用动态生成的类非常有利,可以减少内存占用。以下是使用示例。packagecom.wdbyte;publicclassJEP371Test{publicstaticStringlookup(){return"www.wdbyte.com";}}将编译好的JEP371Test的Class转换成Base64,然后利用Java15的新特性在调用类方法中加载lookup。包com.wdbyte;导入java.lang.invoke.MethodHandle;导入java.lang.invoke.MethodHandles;导入java.lang.invoke.MethodType;导入java.util.Base64;/***@authorwww.wdbyte.com*/publicclassJEP371{privatestaticStringCLASS_INFO="yv66vgAAADQAFAoAAgADBwAEDAAFAAYBABBqYXZhL2xhbmcvT2JqZWN0AQAGPGluaXQ+AQADKClWCAAIAQAOd3d3LndkYnl0ZS5jb20HAAoBABVjb20vd2RieXRlL0pFUDM3MVRlc3QBAARDb2RlAQAPTGluZU51bWJlclRhYmxlAQASTG9jYWxWYXJpYWJsZVRhYmxlAQAEdGhpcwEAF0xjb20vd2RieXRlL0pFUDM3MVRlc3Q7AQAGbG9va3VwAQAUKClMamF2YS9sYW5nL1N0cmluZzsBAApTb3VyY2VGaWxlAQAPSkVQMzcxVGVzdC5qYXZhACEACQACAAAAAAACAAEABQAGAAEACwAAAC8AAQABAAAABSq3AAGxAAAAAgAMAAAABgABAAAAAwANAAAADAABAAAABQAOAA8AAAAJABAAEQABAAsAAAAbAAEAAAAAAAMSB7AAAAABAAwAAAAGAAEAAAAEAAEAEgAAAAIAEw==";publicstaticvoidmain(String[]args)throwsThrowable{byte[]classInBytes=Base64.getDecoder().decode(CLASS_INFO);类proxy=MethodHandles.lookup().defineHiddenClass(classInBytes,true,MethodHandles.Lookup.ClassOption.NESTMATE).lookupClass();System.out.println(proxy.getName());MethodHandlemh=MethodHandles.lookup().findStatic(proxy,"lookup",MethodType.methodType(String.class));字符串结果=(字符串)mh.invokeExact();System.out.println(结果);}}输出结果:com.wdbyte.JEP371Test/0x0000000800c01800www.wdbyte.com4。JEP372:移除NashornJavaScript引擎NashornJavaScript引擎在Java8中引入,在Java11中被标记为过时。由于ECMAScript语言的快速发展,维护NashornJavaScript的成本太高,在Java11中被完全移除Java15。进一步阅读:NashornJavaScript引擎,弃用NashornJavaScript引擎5。JEP373:重新实现DatagramSocketAPIJava13重新实现了旧的SocketAPI,其中一部分在Java13引入时引入。现在,Java15重新实现了遗留的DatagramSocket。延伸阅读:Java13新特性介绍6.JEP374:禁用和丢弃偏向锁(BiasedLocking)之前,JVM在处理同步操作时有一套锁升级机制,比如使用synchronized同步。其中一种锁定机制是偏向锁定。不过从目前的Java开发环境来看,使用这些synchronized类的机会并不多。例如,开发人员更喜欢使用HashMap或ArrayList而不是HashTable和Vector。甚至从另一个角度来看,原来使用偏向锁是为了提升性能,现在看来,性能提升的程度和使用的次数并没有多大用处。偏向锁的引入增加了JVM的复杂度。所以现在偏向锁默认是禁用的,并且会在不久的将来彻底移除,对于Java15,我们仍然可以使用-XX:+UseBiasedLocking来启用偏向锁,但是会提示thisisadeprecatedAPI。7.JEP375:instanceoftypematching(secondarypreview)instanceof类型匹配在Java14中得到了改进,这次只是再次预览,没有任何改动,以接受更多的使用反馈。这个特性在Java16中正式出现,之前使用instanceof进行类型判断后,需要进行对象类型转换才能使用。包com.wdbyte;导入java.util.ArrayList;导入java.util.List;公共类Java14BeaforInstanceof{publicstaticvoidmain(String[]args){Objectobj=newArrayList<>();if(objinstanceofArrayList){ArrayListlist=(ArrayList)obj;list.add("www.wdbyte.com");}System.out.println(obj);}}在Java14中,判断类型转换时可以指定类型的变量名,方便使用。包com.wdbyte;导入java.util.ArrayList;公共类Java14Instanceof{publicstaticvoidmain(String[]args){Objectobj=newArrayList<>();if(objinstanceofArrayListlist){list.add("www.wdbyte.com");}System.out.println(obj);}}可以看出,使用instanceof判断类型成立后,会自动将类型转换为指定的类型。输出:[www.wdbyte.com]延伸阅读:Java14新特性介绍8.JEP377:ZGC:ScalableLowLatencyGarbageCollector(正式发布)ZGC垃圾收集器是在Java11中引入的,但是由于收集的复杂性该设备最初决定逐步推出。然后继续听取用户的反馈和建议来修复问题。而现在,已经很久没有收到用户反馈的问题了,ZGC也到了正式投入使用的时候了。所以ZGC是在Java15正式发布的,你可以使用下面的参数来启用ZGC。$java-XX:+UseZGCclassName9.JEP378:文本块文本块在Java12JEP326RawStringLiterals中引入,在Java13中预览JEP355:文本块(预览版),并在Java14中开始JEP368:文本块(第二次预览),现在,在Java15,文本块是一个官方特性。Stringcontent="""{"upperSummary":null,\"sensitiveTypeList":null,"gmtModified":"2011-08-05\s10:50:09",}""";System.out.println(content);延伸阅读:Java14新特性介绍——JEP368正文块10.JEP379:Shenandoah:低暂停时间垃圾收集器Shenandoah垃圾收集器在Java12中引入,在Java15中成为官方功能的一部分。使用下面的参数来启用Shenandoah垃圾收集器。java-XX:+UseShenandoahGC但是openJDK15默认没有Shenandoah收集器,如果想使用这个功能可以下载AdoptOpenJDK。为什么openJDK中没有Shenandoah垃圾收集器?Shenandoah是一个高性能、低暂停时间的垃圾收集器,它是RedHat领导的项目。当RedHat最初提出将Shenandoah贡献给OpenJDK时,Oracle明确表示不想支持。由于OpenJDK是免费软件,所以不想支持RedHat的Shenandoah也没有问题。最后,RedHat选择与Oracle合作设计一个真正干净的可插拔垃圾收集器接口,让任何人都可以轻松选择垃圾收集器以包含在他们的构建中。最终Shenandoah进入了JDK12,但没有内置到OpenJDK中。11.JEP384:Records(二次预览)在Java14中引入了Record类,在Java15中增强了Record。使其支持密封类型,Record注解和相关反射API等。示例:Record支持密封类型。packagecom.wdbyte;/***@authorwww.wdbyte.com*/publicsealedinterfaceDataBasepermitsDataBaseSelect,DataBaseUpdate{}最终记录DataBaseSelect(@DeprecatedStringtable,Stringsql)implementsDataBase{}finalrecordDataBaseUpdate()implementsDataBase{}在java.lang.Class中添加了两个用于获取Record类信息的公共方法:RecordComponent[]getRecordComponents()booleanisRecord()其他更新JEP381:删除Solaris和SPARC端口Java14JEP362deprecatesSolaris/SPARC,Solaris/x64和Linux/SPARC端口,现已在Java15中正式移除。JEP383:ExternalMemoryAccessAPI(SecondIncubator)JEP385:AbandoningtheRMIActivationMechanism只是取消了RMI激活机制,不影响其他RMI功能。参考https://openjdk.java.net/proj...https://docs.oracle.com/en/ja...https://mkyong.com/java/what-...订阅你好world:)我是Alan,一线技术工具人,认真写文章。喜欢的人都是有才华的,不仅长得帅气,说话也好听。文章持续更新中,可以关注公众号「程序员艾伦」或访问「未读代码博客」。回复【资料】里面有我准备的各种系列的知识点和必读书籍。本文已收录于Github.com/niumoo/JavaNotes。知识点多,系列文章多。欢迎来到星空。