Java15中的隐藏类特性到底是什么?正如我在java15文档中看到的,spring和hibernate框架使用了隐藏类?我需要真实的例子来spring和/或hibernate使用的隐藏类。
siv3szwd1#
要回答这个问题,首先区分java语言和java运行时是很重要的。前者是程序员编写的“java代码”,而后者是人们用来运行用该语言编写的代码的“java程序”(在其他语言中,如kotlin和clojure)。在java语言中,有许多方法可以定义类。大多数类类似于arraylist,它是顶级的,并且有一个程序员定义的名称。但是其他定义类的方法可能没有简单的名称。例如,匿名内部类不提供程序员给它命名的方法。Java8中引入的lambda表达式也是如此。在过去,java运行时有一个限制,即所有类都必须有一个名称,并且必须由运行时公开寻址。这意味着java编译器给一个匿名的内部类一个不太可能与任何其他类的名称冲突的名称,通常带有美元符号,这是java运行时的合法类名,但在java语言中是非法的类名。这是一个实现细节。但是由于类都有名称,并且都可以通过类加载器寻址,所以抽象是“泄漏的”;有一些方法可以通过访问类加载器来解决这些可能被隐藏的类。“隐藏类”是java运行时的一个新特性(对Java15来说),它是程序定义类装入器上运行的其他类无法处理的类的一种方式。它们仍然有名称,但访问的范围是这样的:它们的存在不能“泄露”到程序的其他部分。它不是一种新的语言特性,而是编译器(或运行时框架)可以用来实现某些预先存在的语言特性的工具。对于典型的java程序员来说,这个过程是透明的。除非您的程序编译代码或操纵字节码,否则您不需要担心这个实现细节。但对于那些这样做的人来说,这是他们软件工具箱中一个很有价值的工具。
1条答案
按热度按时间siv3szwd1#
要回答这个问题,首先区分java语言和java运行时是很重要的。前者是程序员编写的“java代码”,而后者是人们用来运行用该语言编写的代码的“java程序”(在其他语言中,如kotlin和clojure)。
在java语言中,有许多方法可以定义类。大多数类类似于arraylist,它是顶级的,并且有一个程序员定义的名称。但是其他定义类的方法可能没有简单的名称。例如,匿名内部类不提供程序员给它命名的方法。Java8中引入的lambda表达式也是如此。
在过去,java运行时有一个限制,即所有类都必须有一个名称,并且必须由运行时公开寻址。这意味着java编译器给一个匿名的内部类一个不太可能与任何其他类的名称冲突的名称,通常带有美元符号,这是java运行时的合法类名,但在java语言中是非法的类名。这是一个实现细节。但是由于类都有名称,并且都可以通过类加载器寻址,所以抽象是“泄漏的”;有一些方法可以通过访问类加载器来解决这些可能被隐藏的类。
“隐藏类”是java运行时的一个新特性(对Java15来说),它是程序定义类装入器上运行的其他类无法处理的类的一种方式。它们仍然有名称,但访问的范围是这样的:它们的存在不能“泄露”到程序的其他部分。它不是一种新的语言特性,而是编译器(或运行时框架)可以用来实现某些预先存在的语言特性的工具。
对于典型的java程序员来说,这个过程是透明的。除非您的程序编译代码或操纵字节码,否则您不需要担心这个实现细节。但对于那些这样做的人来说,这是他们软件工具箱中一个很有价值的工具。