Java中的类销毁
在Java中,当一个类的ClassLoader被垃圾回收时,这个类也会被垃圾回收。
在这之后,如果重新加载这个类,静态字段会被重新初始化。
可以通过使用URLClassloader来轻松测试这一点。
需要注意的是,从jdk 7+开始,即使是在类中定义的String字面量(进入字符串常量池)也会被垃圾回收,如果该类的ClassLoader被垃圾回收。
测试代码:static final Object x = new Object() {{ System.out.println("Good Morning, Groundhog" }};
当一个类的ClassLoader被垃圾回收时,该类也会被垃圾回收。这是因为ClassLoader负责加载类的字节码并创建相应的Class对象。当ClassLoader被垃圾回收时,Class对象也会被垃圾回收。
在重新加载类时,静态字段会被重新初始化。这是因为静态字段是与类相关联的,而不是与实例相关联的。当类被重新加载时,静态字段会被重新初始化为其初始值。
从jdk 7+开始,即使是在类中定义的String字面量(进入字符串常量池)也会被垃圾回收,如果该类的ClassLoader被垃圾回收。这是因为String字面量定义在类的常量池中,而类的常量池是由ClassLoader加载和管理的。当ClassLoader被垃圾回收时,类的常量池也会被垃圾回收,导致String字面量被释放。
为了测试这种情况,可以使用URLClassloader来加载一个类。URLClassloader可以加载指定路径下的类文件,并创建相应的ClassLoader和Class对象。通过在加载的类中定义静态字段或String字面量,并在其初始化时输出一条消息,可以观察到ClassLoader被垃圾回收后,类被重新加载并重新初始化静态字段的过程。
总结起来,当一个类的ClassLoader被垃圾回收时,这个类也会被垃圾回收。重新加载类时,静态字段会被重新初始化。在jdk 7+中,String字面量也会被垃圾回收,如果其所属类的ClassLoader被垃圾回收。