Java类中热替换的概念、设计与实现(3)

  在给出示例代码前,有两点内容需要说明一下:1、要想实现同一个类的不同版本的共存,那么这些不同版本必须由不同的类加载器进行加载,因此就不能把这些类的加载工作委托给系统加载器来完成,因为它们只有一份。2、为了做到这一点,就不能采用系统默认的类加载器委托规则,也就是说我们定制的类加载器的父加载器必须设置为null。

  该定制的类加载器的实现代码如下:

  1.class CustomCL extends ClassLoader {
  2.
  3. private String basedir; // 需要该类加载器直接加载的类文件的基目录
  4.    private HashSet dynaclazns; // 需要由该类加载器直接加载的类名
  5.
  6.    public CustomCL(String basedir, String[] clazns) {
  7.        super(null); // 指定父类加载器为 null
  8.        this.basedir = basedir;
  9.        dynaclazns = new HashSet();
  10.        loadClassByMe(clazns);
  11.    }
  12.
  13.    private void loadClassByMe(String[] clazns) {
  14.        for (int i = 0; i < clazns.length; i++) {
  15.            loadDirectly(clazns[i]);
  16.            dynaclazns.add(clazns[i]);
  17.        }
  18.    }
  19.
  20.    private Class loadDirectly(String name) {
  21.        Class cls = null;
  22.        StringBuffer sb = new StringBuffer(basedir);
  23.        String classname = name.replace('.', File.separatorChar) + ".class";
  24.        sb.append(File.separator + classname);
  25.        File classF = new File(sb.toString());
  26.        cls = instantiateClass(name,new FileInputStream(classF),
  27.            classF.length());
  28.        return cls;
  29.    }
  30.
  31.    private Class instantiateClass(String name,InputStream fin,long len){
  32.        byte[] raw = new byte[(int) len];
  33.        fin.read(raw);
  34.        fin.close();
  35.        return defineClass(name,raw,0,raw.length);
  36.    }
  37.
  38. protected Class loadClass(String name, boolean resolve)
  39.            throws ClassNotFoundException {
  40.        Class cls = null;
  41.        cls = findLoadedClass(name);
  42.        if(!this.dynaclazns.contains(name) && cls == null)
  43.            cls = getSystemClassLoader().loadClass(name);
  44.        if (cls == null)
  45.            throw new ClassNotFoundException(name);
  46.        if (resolve)
  47.            resolveClass(cls);
  48.        return cls;
  49.    }
  50.
  51.}

linux

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwpgdg.html