第七讲 HiddenClass

视频课:https://edu.csdn.net/lecturer/1516

JEP 371:Hidden Classes(隐藏类)

​ 该提案通过启用标准 API 来定义无法发现且具有有限生命周期的隐藏类,从而提高 JVM 上所有语言的效率。JDK内部和外部的框架将能够动态生成类,而这些类可以定义隐藏类。通常来说基于JVM的很多语言都有动态生成类的机制,这样可以提高语言的灵活性和效率。

  • 隐藏类天生为框架设计的,在运行时生成内部的class
  • 隐藏类只能通过反射访问,不能直接被其他类的字节码访问。
  • 隐藏类可以独立于其他类加载、卸载,这可以减少框架的内存占用。

一.概念

​ 不能直接被其他class的二进制代码使用的class。Hidden Classes主要被一些框架用来生成运行时类,但是这些类不是被用来直接使用的,而是通过反射机制来调用。

​ 比如在JDK8中引入的lambda表达式,JVM并不会在编译的时候将lambda表达式转换成为专门的类,而是在运行时将相应的字节码动态生成相应的类对象。

二.为什么要用

​ 如果标准API可以定义隐藏的不可发现且生命周期有限的类,那么动态生成类的JDK内外的框架可以定义隐藏类。JavaScript引擎可以为JavaScript程序翻译的字节码生成隐藏类,因为知道当引擎不再使用这些类时,这些类将被卸载。灵活性、安全性,保证这两点,框架基础实现。

举栗子:

public class HiddenTest {public static void main(String[] args) {Runnable runnable=()->{System.out.println("JDK15测试");};}
}

反编译:

public class HiddenTest {public HiddenTest() {}public static void main(String[] args) {Runnable runnable = () -> {System.out.println("JDK15测试");};}
}

JClassLib截图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-krbIuZMS-1607086350659)(E:\Java15新特性\assets\image-20201201232359801.png)]

invokedynamic:运行时动态解析调用的类;

invokevirtual:调用实例方法

三.特性和支持

3.1 动态生成类特性

  • 不可发现性。因为我们是为某些静态的类动态生成的动态类,所以我们希望把这个动态生成的类看做是静态类的一部分。所以我们不希望除了该静态类之外的其他机制发现。
  • 访问控制。我们希望在访问控制静态类的同时,也能控制到动态生成的类。
  • 生命周期。动态生成类的生命周期一般都比较短,我们并不需要将其保存和静态类的生命周期一致。

API的支持
所以我们需要一些API来定义无法发现的且具有有限生命周期的隐藏类。这将提高所有基于JVM的语言实现的效率。
比如:
java.lang.reflect.Proxy可以定义隐藏类作为实现代理接口的代理类。
java.lang.invoke.StringConcatFactory可以生成隐藏类来保存常量连接方法;
java.lang.invoke.LambdaMetaFactory可以生成隐藏的nestmate类,以容纳访问封闭变量的lambda主体;

java.lang.invoke.LambdaMetaFactory可以生成隐藏的nestmate类,以容纳访问封闭变量的lambda主体;

​ 普通类是通过调用ClassLoader::defineClass创建的,而隐藏类是通过调用Lookup::defineHiddenClass创建的。这使JVM从提供的字节中派生一个隐藏类,链接该隐藏类,并返回提供对隐藏类的反射访问的查找对象。调用程序可以通过返回的查找对象来获取隐藏类的Class对象。

JAVA15.JDK15.7 HiddenClass相关推荐

  1. JAVA15.JDK15新特性.4 TextBlock

    第四讲 TextBlock **视频课:https://edu.csdn.net/lecturer/1516 历史渊源: JDK13:JEP355 第一次预览版本 JDK14:JEP368第二次预览版 ...

  2. JAVA15.JDK15.6 Record二次预览特性

    第六讲Record 视频课:https://edu.csdn.net/lecturer/1516 历史渊源: JEP359: JEP384: ​ 疫情原因,欧美程序员没有变化. ​ 2019,java ...

  3. Java15来了!!!一文详解JDK15新特性

    读懂JDK15新特性,这一篇就够了 一.Java历史简谈 二.我们该如何学习Java新特性 三.Java15新特性详解 特性一:密封类(语法层面) 特性二:instanceof 自动匹配模式(语法层面 ...

  4. AAAIT学院JDK15新特性JAVA15版本

    伴随着2020的寒冬和新冠病毒的肆虐,JAVA迎来了久未已久的JAVA 14.自从2017年JAVA 9发布之后,JAVA的发布版本跟上了敏捷开发的步伐,小步快跑,Java平台发布节奏已从每3年以上的 ...

  5. JDK19都出来了~是时候梳理清楚JDK的各个版本的特性了【JDK15特性讲解】

    JDK各个版本特性讲解-JDK15特性 一.JAVA15概述 2020年9月15日,java15正式发布,(风平浪静的一个版本)共有14个JEP,是时间驱动形式发布的第六个版本.相关文档: https ...

  6. JDK15已发布!网友:我还在JDK8踏步走...

    推荐阅读: 这套Github上40K+star学习笔记,可以帮你搞定95%以上的Java面试 毫不夸张的说,这份SpringBoot学习指南能解决你遇到的98%的问题 给跪了!这套万人期待的 SQL ...

  7. JDK15真的来了,一起来看看它的新特性

    文章目录 简介 JDK15的新特性 JEP 385 Deprecate RMI Activation for Removal JEP 371 Hidden Classes JEP 339 Edward ...

  8. AAAIT学院JDK15新特性历史

    JDK15 **视频课:https://edu.csdn.net/lecturer/1516** 第一讲:JDK15的演进历史 1.JAVA现状 ​ 25周岁,最流行的编程语言,70%,在使用java ...

  9. JDK15新特性密封类可以被继承了!

    2020-9-15发布了JDK15 **视频:https://edu.csdn.net/course/detail/31331**JDK15一共有14个新特性,其中最为笔者印象深刻的莫过于对于--密封 ...

最新文章

  1. 第八周项目一-数组作数据成员(1)
  2. 2016年全球芯片市场或衰退2.13%
  3. WIKIOI 1519 过路费
  4. ‘小会计’的转行之旅
  5. hdu5111 树链剖分,主席树
  6. java enummap_Java EnumMap values()方法与示例
  7. html中ng-src,angularjs – 在ng-src中使用{{}}绑定,但不会加载ng-src
  8. 如何应对软件项目的投标答辩
  9. Visual Studio 2008 SDK 1.1
  10. 呈现模式_曝光 | 福特Mustang Mach-E将提供三种驾驶模式
  11. UGUI的image
  12. 端口映射--PortTunnel
  13. 252个基本词根详解
  14. spring 使用注解遇到的问题
  15. php Class 'ZipArchive' not found
  16. Uva--10098 (next_permutation)
  17. python数字转unicode_python2.7响应数据中unicode转中文
  18. 机器学习在信用评分卡中的应用
  19. Java实现新浪微博第三方登录
  20. 浏览器前进后退静默刷新页面

热门文章

  1. netty系列之:一个价值上亿的网站速度优化方案
  2. 小知识系列:数据库的主键和外键
  3. C++ priority_queue 的使用和源码详解
  4. 14.refresh操作
  5. spark读取文件源码分析-1
  6. 代码分析+原理图解——棋盘覆盖问题-分治法
  7. 最全!最完整的递归下降分析法代码!!! (实验报告,代码)
  8. Python程序开发——第三章 列表与元组
  9. 数据库原理与应用(SQL Server)教程 主键、外键以及联合主键、复合主键和设置种子数目和增量
  10. mysql5.7主从同步与读写分离