java 怎样卸载一个类_Java 动态卸载类[通俗易懂]

2022-08-30 20:54:13 浏览数 (1)

大家好,又见面了,我是你们的朋友全栈君。

通过反射,我们可以动态的将类加载到方法区中,但是卸载这个类,却有着比较严苛的条件

1. 该类所有的实例都已经被GC,也就是JVM中不存在该Class的任何实例。

2. 加载该类的ClassLoader已经被GC。

3. 该类的java.lang.Class 对象没有在任何地方被引用,如不能在任何地方通过反射访问该类的方法.

public static void main(String[] args) throws InterruptedException {

// 等待两秒,让系统加载完所有的类

Thread.sleep(2000);

try {

System.out.println(“Loading…”);

// 利用反射,加载ComplexClass类

URLClassLoader loader = new URLClassLoader(new URL[]{new URL(“file:/Users/wuchen/Desktop/”)});

loader.loadClass(“com.company.wuchen.demo.ComplexClass”);

// 将加载这个类的URLClassLoader的引用置为null,以便让这个类释放

loader = null;

// 启动垃圾回收(JVM虚拟机规范中明确说明,这个方法并不能保证垃圾回收一定执行,但是在此处的确有执行)

System.gc();

} catch (MalformedURLException e) {

e.printStackTrace();

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

}

在虚拟机的参数上添加-XX: TraceClassLoading -XX: TraceClassUnloading,这两个参数告诉虚拟机,需要打印出加载和卸载类的信息,实际运行的结果如下

这个类先是被加载,然后被卸载了

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/144678.html原文链接:https://javaforall.cn

0 人点赞