通过反射,我们可以动态的将类加载到方法区中,但是卸载这个类,却有着比较严苛的条件
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();
}
}
这个类先是被加载,然后被卸载了