package com.yujz;
public class ClassLoaderTest {
//热部署测试
public static void main(String[] args) throws Exception {
String name = "com.yujz.LogImpl";
//通过自定义类加载器 加载 类LogImpl
YujzClassLoader myClassLoader = new YujzClassLoader();
Class<?> clazzClass = Class.forName(name,true,myClassLoader);
System.out.println(clazzClass);
//当采用自定义类加载器 加载 类LogImpl时,这个LogImpl类里面所引用的类(如LogLevel),都会使用自定义的类加载器进行加载,但是,为了阻止自定义
//的类覆盖J2SE的类,当自定义加载器加载某个类时,必须采用委托机制,先让其父加载器加载,如果父加载器找不到,才使用自定义的类加载器 加载
Class<?> clazz = myClassLoader.loadClass(name);
Log log = (Log) clazz.newInstance();
log.log("rt");
//将以下三个变量设置为null,则 类LogImpl的class字节码会从JVM中卸载
log = null;
clazz = null;
myClassLoader = null;
//这时去修改LogImpl.class文件
Thread.sleep(15000);
//将会从新 加载类LogImpl,不需要程序重启,相当于热部署
myClassLoader = new YujzClassLoader();
clazz = myClassLoader.loadClass(name);
log = (Log) clazz.newInstance();
log.log("tt");
}
}
类加载器
最新推荐文章于 2024-09-10 08:00:00 发布