3

是否可以在 Java 中创建一个加载(或更恰当地重新加载)自身的类加载器?

它最初可以由默认的类加载器加载。我想象一个 Java 系统,它能够在通过编译和加载周期运行时进行自我修改。如果是这样,您可以创建许多继承自俄罗斯娃娃加载器的对象,以动态更新它们的逻辑。

4

1 回答 1

1

您可以重新加载限定名称不以another开头的每个类的代码,但这不会重新加载该类。相反,它会创建一个具有相同限定名称但定义不同的新类。java.ClassLoaderClassLoader

请参阅Java® 虚拟机规范,§5.3。创建和加载

类加载器L可以C通过直接定义或委托给另一个类加载器来创建。如果直接L创建C,我们说L 定义 C,或者等价地,L就是定义加载C
…<br> 在运行时,类或接口不仅仅由其名称决定,而是由一对:它的二进制名称(第 4.2.1 节)和它的定义类加载器决定。

因此,当您使用不同的类加载器实例定义与现有类具有相同限定名称的类时,您实际上是在创建一个新的运行时类。当然,该类可能会扩展ClassLoader并可用于再次定义具有相同限定名称的新类。

这些新类是否具有相同的字节码、是修改后的版本还是完全不相关的,都无关紧要。

这与大多数支持重新加载模块的框架的工作方式很接近。他们创建了一个新的类加载器(但不是旧类的子类),它将“重新加载”模块的所有类,包括未更改的类,因为从技术上讲,它创建了一个新的不相关类的动物园,这些类必须在每个类之间链接其他。
然后旧类必须超出范围,这需要小心。如果类加载器的所有类都未使用,则类加载器只能进行垃圾收集。一个类的单个实例可能会阻止其类加载器及其所有定义的类被垃圾收集......</p>

于 2016-06-24T09:10:42.833 回答