一、背景
之前总结一篇关于自定义类加载器的文章,自定义类加载器主要是重写findClass方法;它的原理就是,当父类加载都找不到要加载的类时,通过重写的findClass方法可以实现自定义类加载器;我们知道类加载的原理是双亲委派机制,那么今天主要是想通弄重新loadClass方法来打破双亲委派机制;这种操作一般会出现在热部署过程中!
二、实现
1.需要被加载的类
package com.example.jvm.demo;
import java.io.PrintStream;
public class Hello
{
public void show()
{
System.out.println("hello");
}
}
2.测试类
public class JVM_006_ClassReloading2 {
public static class MyLoad extends ClassLoader{
@Override
public Class<?> loadClass(String name) throws ClassNotFoundException {
File file = new File("d:/test/"+name.replace(".","/").concat(".class"));
if (!file.exists()){
return super.loadClass(name);
}
try {
InputStream is = new FileInputStream(file);
byte[] b = new byte[is.available()];
is.read(b);
return defineClass(name,b,0,b.length);
}catch (IOException e){
e.printStackTrace();
}
return super.loadClass(name);
}
}
public static void main(String[] args) throws ClassNotFoundException {
MyLoad myLoad = new MyLoad();
Class clazz1 = myLoad.loadClass("com.example.jvm.demo.Hello");
myLoad = null;
myLoad = new MyLoad();
Class clazz2 = myLoad.loadClass("com.example.jvm.demo.Hello");
System.out.println(clazz1==clazz2);
}
}
3.测试结果
4.总结
通过自定义的MyLoad类加载通过一个class文件,判断加载后的结果,发现不相等!说明class文件被重新加载进内存了!按照类加载机制,如果某一个clas文件已经被加载进内存后是无法再重新被加载的,此时说明,已经打破了双亲委派的加载机制。