Java类加载器俄罗斯玩偶

Java类加载器俄罗斯玩偶,java,compilation,jvm,classloader,dynamic-class-loaders,Java,Compilation,Jvm,Classloader,Dynamic Class Loaders,在Java中是否可以创建一个类加载器来加载(或者更合适地重新加载)自己 它最初可以由默认的类加载器加载。我设想一个Java系统能够通过编译和加载循环在运行时进行自我修改。如果是这样,您可以创建许多从您的Russian doll loader继承的对象来动态更新它们的逻辑。您可以重新加载限定名称不以java开头的每个类的代码。在另一个类加载器中,但这不会重新加载该类。相反,它创建了一个新类,该类具有相同的限定名,但具有不同的定义ClassLoader 看 类加载器L可以通过直接定义或委托给另一个类

在Java中是否可以创建一个类加载器来加载(或者更合适地重新加载)自己

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

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

类加载器
L
可以通过直接定义或委托给另一个类加载器来创建
C
。如果
L
直接创建
C
,我们说
L
定义
C
,或者,等价地说,
L
C
的定义加载器

在运行时,类或接口不是由其名称决定的,而是由一对名称决定的:它的二进制名称(§4.2.1)和它的定义类加载器

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

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

这接近于大多数支持模块重新加载的框架的工作方式。它们创建一个新的类加载器(但不是旧类加载器的子类),该加载器将“重新加载”模块的所有类,包括未更改的类,因为从技术上讲,它创建了一个新的不相关类的动物园,这些类必须相互链接。

然后,旧类必须超出范围,这需要一些小心。如果类加载器的所有类都未使用,则只能对其进行垃圾收集。一个类的单个实例可能会阻止其类加载器及其所有已定义的类被垃圾收集…

如果不加载它自己,它将如何加载自己?它最初将由默认类加载器加载。您是否尝试重新加载类加载器本身?这是问题的核心。对更具体地说,从它自己的逻辑重新加载类…而不是从另一个类中的逻辑。你能描述一下你想要做什么吗?听起来你在问如何最好地实施一种方法来实现一个基本目标,但最好退一步,问问这是否是最好的方法。谢谢,回答得好。那么,一个类要成功地重新加载它自己,它必须1.)摆脱它自己的旧版本(这是不可能的,因为每个类都维护一个父类加载器变量)和2.)更新所有链接,这是真的吗?如果这是真的,那么答案是否定的,这是不可能的。事实上,对于
类加载器
(只有通过委托给另一个实际执行工作的
类加载器
才能实现完全重新加载的语义)。这并不是要与通过Instrumentation API的真正重新加载混淆,这种真正的重新加载有几个限制,并且不会更改定义的
类加载器