一、背景

之前总结一篇关于自定义类加载器的文章,自定义类加载器主要是重写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.测试结果

ios开发 重写init方法 重写loadclass方法_jvm

4.总结

通过自定义的MyLoad类加载通过一个class文件,判断加载后的结果,发现不相等!说明class文件被重新加载进内存了!按照类加载机制,如果某一个clas文件已经被加载进内存后是无法再重新被加载的,此时说明,已经打破了双亲委派的加载机制。