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

Java15新特性:隐藏类

时间:2023-04-01 19:22:45 Java

什么是隐藏类?隐藏类是不能被其他类直接使用的类。引入隐藏类的主要目的是为了给框架使用,让框架在运行时生成类,通过反射间接使用。可能有点抽象,没关系,我们举个例子来直观的理解一下吧!隐藏类案例第一步:先创建一个普通Java类publicclassJEP371HiddenClasses{publicstaticStringhello(){return"https://www.didispace.com";}}第二步:编译,或者说编译完class文件。ThenuseBase64toEncodethefilecontent,youcanusevarioustools,orusethefollowingcodetogetit:StringfilePath="JEP371HiddenClasses.class";byte[]b=Files.readAllBytes(Paths.get(filePath));log.info(Base64.getEncoder().encodeToString(b));执行一下,获取到内容如下:yv66vgAAAD0AFAoAAgADBwAEDAAFAAYBABBqYXZhL2xhbmcvT2JqZWN0AQAGPGluaXQ+AQADKClWCAAIAQAZaHR0cHM6Ly93d3cuZGlkaXNwYWNlLmNvbQcACgEALmNvbS9kaWRpc3BhY2UvZGVidWcvamF2YTE1L0pFUDM3MUhpZGRlbkNsYXNzZXMBAARDb2RlAQAPTGluZU51bWJlclRhYmxlAQASTG9jYWxWYXJpYWJsZVRhYmxlAQAEdGhpcwEAMExjb20vZGlkaXNwYWNlL2RlYnVnL2phdmExNS9KRVAzNzFIaWRkZW5DbGFzc2VzOwEABWhlbGxvAQAUKClMamF2YS9sYW5nL1N0cmluZzsBAApTb3VyY2VGaWxlAQAYSkVQMzcxSGlkZGVuQ2xhc3Nlcy5qYXZhACEACQACAAAAAAACAAEABQAGAAEACwAAAC8AAQABAAAABSq3AAGxAAAAAgAMAAAABgABAAAAAwANAAAADAABAAAABQAOAA8AAAAJABAAEQABAAsAAAAbAAEAAAAAAAMSB7AAAAABAAwAAAAGAAEAAAAGAAEAEgAAAAIAEw==这个内容就是第一步写的类。第三步:加载上面反射生成的类,调用隐藏类中的hello函数,代码如下:/***程序员DD*Java新特性解读*/@TestvoidtestHiddenClasses()throwsThrowable{//1.加载encode之后的隐藏类StringCLASS_INFO="yv66vgAAAD0AFAoAAgADBwAEDAAFAAYBABBqYXZhL2xhbmcvT2JqZWN0AQAGPGluaXQ+AQADKClWCAAIAQAZaHR0cHM6Ly93d3cuZGlkaXNwYWNlLmNvbQcACgEALmNvbS9kaWRpc3BhY2UvZGVidWcvamF2YTE1L0pFUDM3MUhpZGRlbkNsYXNzZXMBAARDb2RlAQAPTGluZU51bWJlclRhYmxlAQASTG9jYWxWYXJpYWJsZVRhYmxlAQAEdGhpcwEAMExjb20vZGlkaXNwYWNlL2RlYnVnL2phdmExNS9KRVAzNzFIaWRkZW5DbGFzc2VzOwEABWhlbGxvAQAUKClMamF2YS9sYW5nL1N0cmluZzsBAApTb3VyY2VGaWxlAQAYSkVQMzcxSGlkZGVuQ2xhc3Nlcy5qYXZhACEACQACAAAAAAACAAEABQAGAAEACwAAAC8AAQABAAAABSq3AAGxAAAAAgAMAAAABgABAAAAAwANAAAADAABAAAABQAOAA8AAAAJABAAEQABAAsAAAAbAAEAAAAAAAMSB7AAAAABAAwAAAAGAAEAAAAGAAEAEgAAAAIAEw==";byte[]classInBytes=getDecoder().decode(CLASS_INFO);类代理=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));字符串结果=(字符串)mh.invokeExact();log.info(result);}具体执行逻辑就不啰嗦了。读者可以根据评论了解测试最终执行的内容,可以得到如下输出:17:20:50.360[main]INFOcom.didispace.debug.java15.JEP371Test-com.didispace.debug.java15.JEP371HiddenClasses/0x0000000800cb0c0017:20:50.361[main]INFOcom.didispace.debug.java15.JEP371Test-hello17:360:5[main]INFOcom.didispace.debug.java15.JEP371Test-https://www.didispace.com第一行:输出这个隐藏类的类名第二行:输出这个隐藏类下的方法名第三行:调用隐藏类下的hello方法得到的返回内容是不是很简单?如果你和我一样平时参与一些基础框架的开发,你一定觉得这个功能相当不错!