前几天介绍给大家Java 今天继续介绍17中新推出的密封类。Java 15开始推出的新内容:。
如果你喜欢做包装和框架,这个内容可能对你很有用!
什么是隐藏类
隐藏类是其他类不能直接使用的类。引入隐藏类的主要目的是使用框架,使框架在运行过程中生成类,并通过反射间接使用。
这可能有点抽象。没关系。让我们通过一个例子直观地理解它!
如果你关注Java记沿知识,记得关注微信官方账号:程序猿DD,继续分享前沿技术内容,积累普通技术人员的弯道超车资本!
隐藏类案例
:先创造一个普通的Java类
publicclassJEP371HiddenClasses{ publicstaticStringhello(){ return"https://www.didispace.com"; } }
:编译一下,或得编译后的class文件。然后使用Base64对文件内容Encode,您可以使用各种工具或以下代码:
StringfilePath="JEP371HiddenClasses.class"; byte[]b=Files.readAllBytes(Paths.get(filePath)); log.info(Base64.getEncoder().encodeToString(b));
执行以下内容:
yv66vgAAAD0AFAoAAgADBwAEDAAFAAYBABBqYXZhL2xhbmcvT2JqZWN0AQAGPGluaXQ AQADKClWCAAIAQAZaHR0cHM6Ly93d3cuZGlkaXNwYWNlLmNvbQcACgEALmNvbS9kaWRpc3BhY2UvZGVidWcvamF2YTE1L0pFUDM3MUhpZGRlbkNsYXNzZXMBAARDb2RlAQAPTGluZU51bWJlclRhYmxlAQASTG9jYWxWYXJpYWJsZVRhYmxlAQAEdGhpcwEAMExjb20vZGlkaXNwYWNlL2RlYnVnL2phdmExNS9KRVAzNzFIaWRkZW5DbGFzc2VzOwEABWhlbGxvAQAUKClMamF2YS9sYW5nL1N0cmluZzsBAApTb3VyY2VGaWxlAQAYSkVQMzcxSGlkZGVuQ2xhc3Nlcy5qYXZhACEACQACAAAAAAACAAEABQAGAAEACwAAAC8AAQABAAAABSq3AAGxAAAAAgAMAAAABgABAAAAAwANAAAADAABAAAABQAOAA8AAAAJABAAEQABAAsAAAAbAAEAAAAAAAMSB7AAAAABAAwAAAAGAAEAAAAGAAEAEgAAAAIAEw==
这个内容是第一步写的。
:通过反射加载生成的类,并调用隐藏类hello代码如下:函数:
/** *程序猿DD *<ahref="https://www.didispace.com/java-features/">Java新特性解读</a> */ @Test voidtestHiddenClasses()throwsThrowable{ //1.加载encode隐藏类之后 StringCLASS_INFO="yv66vgAAAD0AFAoAAgADBwAEDAAFAAYBABBqYXZhL2xhbmcvT2JqZWN0AQAGPGluaXQ AQADKClWCAAIAQAZaHR0cHM6Ly93d3cuZGlkaXNwYWNlLmNvbQcACgEALmNvbS9kaWRpc3BhY2UvZGVidWcvamF2YTE1L0pFUDM3MUhpZGRlbkNsYXNzZXMBAARDb2RlAQAPTGluZU51bWJlclRhYmxlAQASTG9jYWxWYXJpYWJsZVRhYmxlAQAEdGhpcwEAMExjb20vZGlkaXNwYWNlL2RlYnVnL2phdmExNS9KRVAzNzFIaWRkZW5DbGFzc2VzOwEABWhlbGxvAQAUKClMamF2YS9sYW5nL1N0cmluZzsBAApTb3VyY2VGaWxlAQAYSkVQMzcxSGlkZGVuQ2xhc3Nlcy5qYXZhACEACQACAAAAAAACAAEABQAGAAEACwAAAC8AAQABAAAABSq3AAGxAAAAAgAMAAAABgABAAAAAwANAAAADAABAAAABQAOAA8AAAAJABAAEQABAAsAAAAbAAEAAAAAAAMSB7AAAAABAAwAAAAGAAEAAAAGAAEAEgAAAAIAEw=="; byte[]classInBytes=getDecoder().decode(CLASS_INFO); Class<?>proxy=MethodHandles.lookup() .defineHiddenClass(classInBytes,true,MethodHandles.Lookup.ClassOption.NESTMATE) .lookupClass(); //输出类名 log.info(proxy.getName()); //输出类有哪些函数? for(Methodmethod:proxy.getDeclaredMethods()){ log.info(method.getName()); } //2.调用hello函数 MethodHandlemh=MethodHandles.lookup().findStatic(proxy,"hello",MethodType.methodType(String.class)); Stringresult=(String)mh.invokeExact(); log.info(result); }
具体的执行逻辑并不冗长,读者可以根据注释来理解。本测试内容的最终执行可获得以下输出:
17:20:50.360[main]INFOcom.didispace.debug.java15.JEP371Test-com.didispace.debug.java15.JEP371HiddenClasses/0x0000000800cb0c00 17:20:50.361[main]INFOcom.didispace.debug.java15.JEP371Test-hello 17:20:50.361[main]INFOcom.didispace.debug.java15.JEP371Test-https://www.didispace.com
第一行:输出这个隐藏类的类名
第二行:输出隐藏类下的方法名称
第三行:调用隐藏类下hello方法获得的返回内容
这很简单吗?如果你像我一样参与一些基本框架和平台的开发,你一定认为这个功能很好。毕竟,还有另一种实现动态功能的方法!
好了,今天的分享就到这里!关于Java我正在连载新特性的话题Java新特色专栏:https://www.didispace.com/java-features看文档形式Java新特点,阅读学习体验更好!
我们创建了一个高质量的技术交流小组。当我们和优秀的人在一起时,我们也会变得优秀。快速点击添加组,享受一起成长的快乐。此外,如果你最近想换工作,我花了两周时间收集了一波大型工厂经典。那些准备在假期后换工作的人可以点击这里!
推荐阅读
再来看个Java 16 增强的switch模型匹配能力
switch表达式增强终于可以不写了break了!
详解 Java 新特征17:密封
··································
你好,我是程序猿DD,开发老司机10年,阿里云MVP、腾讯云TV、出过书创过业、国企4年互联网6年。从普通开发到架构师、再到合伙人。一路过来,给我最深的感受就是一定要不断学习并关注前沿。只要你能坚持下来,多思考、少抱怨、勤动手,就很容易实现弯道超车!所以,不要问我现在干什么是否来得及。如果你看好一个事情,一定是坚持了才能看到希望,而不是看到希望才去坚持。相信我,只要坚持下来,你一定比现在更好!如果你还没什么方向,可以先关注我,这里会经常分享一些前沿资讯,帮你积累弯道超车的资本。
点击领取2022最新学习资料