大家好,又见面了,我是你们的朋友全栈君。
通过反射,我们可以动态的将类加载到方法区中,但是卸载这个类,却有着比较严苛的条件
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