Java 15 新特性:隐藏类

什么是隐藏类

隐藏类,是一种不能被其他类直接使用的类。引入隐藏类的主要目的是给框架来使用,使得框架可以在运行时生成类,并通过反射间接使用它们。可能有点抽象,不要紧,下面我们通过一个例子来直观的认识它!

隐藏类案例

第一步:先创建一个普通的Java

public class JEP371HiddenClasses {

    public static String hello() {
        return "https://www.didispace.com";
    }

}

第二步:编译一下,或得编译后的class文件。然后使用Base64对文件内容Encode,你可以用各种工具,也可以用下面代码来获取:

String filePath = "JEP371HiddenClasses.class";
byte[] b = Files.readAllBytes(Paths.get(filePath));
log.info(Base64.getEncoder().encodeToString(b));

执行一下,获取到内容如下:

yv66vgAAAD0AFAoAAgADBwAEDAAFAAYBABBqYXZhL2xhbmcvT2JqZWN0AQAGPGluaXQ+AQADKClWCAAIAQAZaHR0cHM6Ly93d3cuZGlkaXNwYWNlLmNvbQcACgEALmNvbS9kaWRpc3BhY2UvZGVidWcvamF2YTE1L0pFUDM3MUhpZGRlbkNsYXNzZXMBAARDb2RlAQAPTGluZU51bWJlclRhYmxlAQASTG9jYWxWYXJpYWJsZVRhYmxlAQAEdGhpcwEAMExjb20vZGlkaXNwYWNlL2RlYnVnL2phdmExNS9KRVAzNzFIaWRkZW5DbGFzc2VzOwEABWhlbGxvAQAUKClMamF2YS9sYW5nL1N0cmluZzsBAApTb3VyY2VGaWxlAQAYSkVQMzcxSGlkZGVuQ2xhc3Nlcy5qYXZhACEACQACAAAAAAACAAEABQAGAAEACwAAAC8AAQABAAAABSq3AAGxAAAAAgAMAAAABgABAAAAAwANAAAADAABAAAABQAOAA8AAAAJABAAEQABAAsAAAAbAAEAAAAAAAMSB7AAAAABAAwAAAAGAAEAAAAGAAEAEgAAAAIAEw==

这个内容就是第一步写的类。

第三步:通过反射加载上面生成的类,并调用隐藏类中的hello函数,代码如下:

/**
 * 程序猿DD
 * Java新特性解读
 */
@Test
void testHiddenClasses() throws Throwable {
  // 1. 加载encode之后的隐藏类
  String CLASS_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(Method method : proxy.getDeclaredMethods()) {
    log.info(method.getName());
  }
  // 2. 调用hello函数
  MethodHandle mh = MethodHandles.lookup().findStatic(proxy, "hello", MethodType.methodType(String.class));
  String result = (String) mh.invokeExact();
  log.info(result);
}

具体执行逻辑就不啰嗦了,读者可以根据注释来理解。最后执行这个测试内容,可以获得如下输出:

17:20:50.360 [main] INFO com.didispace.debug.java15.JEP371Test - com.didispace.debug.java15.JEP371HiddenClasses/0x0000000800cb0c00
17:20:50.361 [main] INFO com.didispace.debug.java15.JEP371Test - hello
17:20:50.361 [main] INFO com.didispace.debug.java15.JEP371Test - https://www.didispace.com
  • 第一行:输出了这个隐藏类的类名
  • 第二行:输出了这个隐藏类下的方法名称
  • 第三行:调用隐藏类下的hello方法获得的返回内容

是不是还挺简单?

如果你跟我一样平时会参与一些基础框架的开发工作的话,一定觉得这个功能还挺不错的吧!

欢迎关注我的公众号:程序猿DD。第一时间了解前沿行业消息、分享深度技术干货、获取优质学习资源

Original: https://www.cnblogs.com/didispace/p/16286483.html
Author: 程序猿DD
Title: Java 15 新特性:隐藏类

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/590261/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • javascript基本属性访问对象的属性和方法

    var myName = “Shelley”; //字符串基本类型 alert(myName.length); //隐式创建String对象,数值与myNa…

    Java 2023年6月6日
    065
  • Spring事务的5种隔离级别和7种传播性

    ISOLATION_DEFAULT,ISOLATION_READ_UNCOMMITTED,ISOLATION_READ_COMMITTED,ISOLATION_REPEATABLE…

    Java 2023年5月30日
    058
  • 计算机网络基础

    几乎所有的计算机程序,都会牵涉到网络通信。因此,了解计算机基础网络知识,对每一个程序员来说都是异常重要的。 本文在介绍一些基础网络知识的同时,给出了一些高质量的系列文章链接,以方便…

    Java 2023年5月29日
    075
  • mybatis批量操作

    List类型 Mapper.java public int updateAccount(List<orderjob> orderJobs);</orderjob&…

    Java 2023年6月9日
    051
  • JAVA 中 string 和 int 互相转化 1、 int i = Integer.parseInt([String]); 或 i = Integer.parseInt([String],[int radix]); 2、 int i = Integer.valueOf(my_str).intValue();

    在实际开发工作中,有时候为因为一些特殊原因,做类型转换,今天说一下string类型和int类型之间的转换。 1 如何将字串 String 转换成整数 int? A. 有两个方法: …

    Java 2023年5月29日
    050
  • linux基本命令

    cd 切换文件夹 cd /home 绝对路径 以包目录开头 cd admin 相对路径 不以包目录开头 cd .. 返回上级目录 cd ~ 到自己的家目录 /home/admin …

    Java 2023年6月16日
    074
  • 字典生成

    crunch的使用 依然是熟悉的console-crunch-xxx min:设定最小字符串长度 max:设定最大字符串长度 -o:将生成的字典保存到指定文件 -t:指定密码输出的…

    Java 2023年6月7日
    070
  • 22.2.14session和反反爬处理

    * import requestsfrom lxml import etree​def refererPrt():    url = "https://www.pearv…

    Java 2023年6月13日
    058
  • springmvc

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月9日
    073
  • Java8Stream流2

    上期对stream流大致总结了一下,后面又做了一些练习,大家可以参考一下。 首先需要建一个 Product的实体类,后面会用到 @Data @AllArgsConstructor …

    Java 2023年6月15日
    048
  • Springboot+MDC+traceId日志中打印唯一traceId

    原文:https://www.jb51.net/article/225488.htm 目录 为什么需要这个traceId 2.通过MDC设置traceId 2.1 使用filter…

    Java 2023年5月30日
    083
  • Ceph集群搭建记录

    环境准备 基础环境 node00 192.168.247.144 node00 node01 192.168.247.135 node01 node02 192.168.247.1…

    Java 2023年6月10日
    086
  • 经典实验–飞机大战小游戏

    ·一、需求设计 1.为检测C语言的学习成果,根据所学的C语言知识,设计程序:飞机大战小游戏; 2.自行定义变量,函数或结构体,编写源代码并进行编译运行测试; 3.根据编写的代码,自…

    Java 2023年6月15日
    049
  • 什么是最左匹配原则?

    什么是最左匹配原则? 什么是最左匹配原则?如果 SQL 语句中用到了组合索引中的最左边的索引,那么这条 SQL 语句就可以利用这个组合索引去进行匹配。当遇到范围查询(>、 O…

    Java 2023年6月5日
    054
  • 机器学习(3)数据的降维之特征选择

    博客园 :当前访问的博文已被密码保护 请输入阅读密码: Original: https://www.cnblogs.com/cgy1995/p/9980369.htmlAuthor…

    Java 2023年6月8日
    059
  • 3-面向对象(2)

    一、Object类的使用 1.java.lang.Object类的说明: Object类是所Java类的根父类 如果在类的声明中未使用extends关键字指明其父类,则默认父类为j…

    Java 2023年6月7日
    060
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球