Spring java 15中的隐藏类是什么?

Spring java 15中的隐藏类是什么?,spring,hibernate,java-15,Spring,Hibernate,Java 15,Java15的具体功能是什么 正如我在Java15文档中读到的,Spring和Hibernate框架使用了隐藏类?我需要一个真实的例子来演示Spring和/或Hibernate使用的隐藏类。要回答这个问题,首先必须区分Java语言和Java运行时。前者是程序员编写的“Java代码”,而后者是人们用来运行用该语言编写的代码(在其他语言中,如Kotlin和Clojure)的“Java程序” 在Java语言中,有许多方法来定义类。大多数类类似于ArrayList,它是顶级的,并且有一个程序员定义的名称

Java15的具体功能是什么


正如我在Java15文档中读到的,SpringHibernate框架使用了隐藏类?我需要一个真实的例子来演示Spring和/或Hibernate使用的隐藏类。

要回答这个问题,首先必须区分Java语言和Java运行时。前者是程序员编写的“Java代码”,而后者是人们用来运行用该语言编写的代码(在其他语言中,如Kotlin和Clojure)的“Java程序”

在Java语言中,有许多方法来定义类。大多数类类似于ArrayList,它是顶级的,并且有一个程序员定义的名称。但其他定义类的方法可能没有简单的名称。例如,匿名内部类不提供程序员给它命名的方法。Java8中引入的lambda表达式也是如此

在过去,Java运行时有一个限制,即所有类都必须有一个名称,并且必须由运行时公开寻址。这意味着Java编译器为匿名内部类提供的名称不可能与任何其他类的名称冲突,通常带有美元符号,这是Java运行时的合法类名,但在Java语言中是非法类名。这是一个实现细节。但是由于类都有名称,并且都可以通过类加载器寻址,所以抽象是“泄漏的”;可以通过访问类加载器来解决这些可能被隐藏的类

“隐藏类”是Java运行时的一个新()特性,是程序定义类装入器上运行的其他类无法处理的类的一种方式。它们仍然有名称,但访问权限的范围是,它们的存在不能“泄露”到程序的其他部分。它不是一种新的语言特性,而是编译器(或运行时框架)可以用来实现某些预先存在的语言特性的工具


对于典型的Java程序员来说,这个过程是透明的。除非您的程序编译代码或处理字节码,否则您不需要担心这个实现细节。但对于那些这样做的人来说,这是他们软件工具箱中一个很有价值的工具。

我从GitHub下载了Spring framework源代码,搜索了“defineHiddenClass”,但没有得到任何点击。本网站的目的不是提供教程,尤其不是为了解决不存在的问题。此外,当您使用lambda表达式或方法引用时,您已经在使用隐藏类;您不能用Java代码编写一个。它们是一种用于动态生成类的低级库的实现技术,例如
LambdaMetafactory
,Java编译器在翻译lambda表达式时使用这些类。例如,请参见:@BrianGoetz有一件事我不懂。
STRONG
选项的用途是什么?为什么要阻止一个完全不可访问的类的垃圾收集,而这个类永远不可能被重用?据我所知,通过
Unsafe
创建的隐藏类没有这个选项,没有它lambda表达式也能正常工作。实际上,这个特性自Java7以来就存在了。但现在,它已经成为一种标准,可以在不创建对特定运行时实现的依赖关系的情况下使用。