Java类装载机俄罗斯娃娃

时间:2016-06-23 20:32:42

标签: java compilation jvm classloader dynamic-class-loaders

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

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

1 个答案:

答案 0 :(得分:0)

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

请参阅The Java® Virtual Machine Specification, §5.3. Creation and Loading

  

类加载器L可以通过直接定义它或通过委托给另一个类加载器来创建C。如果L直接创建C,我们会说L 定义 C,或者等同于L定义C的加载程序   ...
  在运行时,类或接口不是由它的名称单独确定,而是由一对确定:它的二进制名称(§4.2.1)及其定义的类加载器。

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

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

这与支持重新加载模块的大多数框架的工作方式非常接近。他们创建了一个新的类加载器(但不是旧版本的子类),它将“重新加载”模块的所有类,包括未更改的类,因为从技术上讲,它创建了一个新的无关的动物园必须相互联系的课程。
那么旧的课程必须超出范围,这需要一些小心。如果类的所有未使用,则类加载器只能收集垃圾。一个类的单个实例可以防止其类加载器及其所有已定义的类被垃圾收集......