JAVA15.JDK15.7 HiddenClass

举报
tea_year 发表于 2021/12/23 00:46:30 2021/12/23
【摘要】 第七讲 HiddenClass 视频课:https://edu.csdn.net/lecturer/1516 JEP 371:Hidden Classes(隐藏类) ​ 该提案通过启用标准 API ...

第七讲 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测试");
        };
    }
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

反编译:

public class HiddenTest {
    public HiddenTest() {
    }

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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

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对象。

文章来源: aaaedu.blog.csdn.net,作者:tea_year,版权归原作者所有,如需转载,请联系作者。

原文链接:aaaedu.blog.csdn.net/article/details/110672803

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。