1

Java 15中的隐藏类功能到底是什么?

正如我在 Java 15 文档中所读到的,SpringHibernate框架使用了隐藏类?我需要 Spring 和/或 Hibernate 使用的 Hidden Classes 的真实示例。

4

1 回答 1

2

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

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

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

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

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

于 2021-03-01T17:11:24.667 回答