默认的类加载器,是通过读取.class字节码文件来加载Class。但动态运行时不需要生成.class保存编译后的字节码文件,所以我们需要自定义类加载器,直接读取字节码加载类。
给类加载器新增一个方法,将加载字节码的defindClass方法暴露出去就行。
/**
* 为了多次载入执行类而加入的加载器
* 设计一个loadByte()方法将defineClass()方法开放出来,只有我们调用loadByte()方法时才使用自己的类加载器
* 虚拟机调用HotSwapClassLoader时还是按照双亲委派模型使用loadClass方法进行类加载
*/
public class HotSwapClassLoader extends ClassLoader {
/**
* 使用指定的父类加载器创建一个新的类加载器进行委派
*/
public HotSwapClassLoader() {
super(HotSwapClassLoader.class.getClassLoader());
}
public Class<?> loadByte(String name, byte[] classByte) throws ClassLoadException {
try {
return defineClass(null, classByte, 0, classByte.length);
} catch (Exception e) {
throw new ClassLoadException(e);
}
}
}
好啦,至此类加载阶段完成,改动不大。
在线Java 动态运行Java源代码