美文网首页
类加载器双亲委托机制

类加载器双亲委托机制

作者: 龙剑灵 | 来源:发表于2019-12-30 01:53 被阅读0次

自定义类加载器 MyTest18

public class MyTest18 extends ClassLoader{

  private String classLoaderName;

  private String path;

  private String feleExtension = ".class";

  public MyTest18(String classLoaderName) {
    super(); //将系统类加载器当做该类加载的父加载器
    this.classLoaderName = classLoaderName;
  }

  public MyTest18(ClassLoader parent, String classLoaderName) {
    super(parent);// 显示指定该类加载器父加载器
    this.classLoaderName = classLoaderName;
  }
  public void setPath(String path) {
    this.path = path;
  }

  @Override
  protected Class<?> findClass(String className) throws ClassNotFoundException {
    System.out.println("className: " + className);
    System.out.println("classLoaderName: " + this.classLoaderName);

    byte[] data = this.loadClassData(className);
    return this.defineClass(className, data, 0, data.length);
  }

  private byte[] loadClassData(String className){
    byte[] data = null;
    InputStream is = null;
    ByteArrayOutputStream baos = null;

    System.out.println("loadClassData.222.........");
    try {
      className = className.replace(".", "\\");
      String fileName = this.path + className + this.feleExtension;
      System.out.println("fileName: " + fileName);
      is = new FileInputStream(new File(fileName));
      baos = new ByteArrayOutputStream();
      int ch = 0;
      while (-1 != (ch = is.read())) {
        baos.write(ch);
      }
      data = baos.toByteArray();
    } catch (Exception e) {

    }finally {
      try {
        is.close();
        baos.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
    return data;
  }
public static void main(String[] args) throws Exception {

    MyTest17 myTest = new MyTest17("loader17");
    //myTest.setPath("E:\\gitSpace\\jdk8\\out\\production\\classes\\");
    myTest.setPath("c:\\");

    Class<?> clazz = myTest.loadClass("jvm.classloader.MyTest2");
    System.out.println("class: " + clazz);
    System.out.println("class.hashCode: " + clazz.hashCode());
    Object object = clazz.newInstance();
    System.out.println(object);
    System.out.println("--------------------------------");

    MyTest17 myTest2 = new MyTest17("loader177");
    //myTest.setPath("E:\\gitSpace\\jdk8\\out\\production\\classes\\");
    myTest2.setPath("c:\\");

    Class<?> clazz2 = myTest2.loadClass("jvm.classloader.MyTest2");
    System.out.println("class2: " + clazz2);
    System.out.println("class2.hashCode: " + clazz2.hashCode());
    Object object2 = clazz2.newInstance();
    System.out.println(object2);
  }
本例中,2个类加载器,都委托系统(或应用)加载器去加载,因此重写的findClass不会执行,没输出,在类路径上能找到,只会执行一次加载, hashCode是一致的

class: class jvm.classloader.MyTest2
class.hashCode: 366712642
jvm.classloader.MyTest2@6d06d69c


class2: class jvm.classloader.MyTest2
class2.hashCode: 366712642
jvm.classloader.MyTest2@7852e922

若将类路径下的MyTest2.class删除后则输出如下
每个类加载器都有自己的命名空间,命名空间由该加载器及所有父加载器所加载的类组成

className: jvm.classloader.MyTest2
classLoaderName: loader17
loadClassData..........
fileName: c:\jvm\classloader\MyTest2.class
class: class jvm.classloader.MyTest2
class.hashCode: 135721597
jvm.classloader.MyTest2@87aac27


className: jvm.classloader.MyTest2
classLoaderName: loader177
loadClassData..........
fileName: c:\jvm\classloader\MyTest2.class
class2: class jvm.classloader.MyTest2
class2.hashCode: 1406718218
jvm.classloader.MyTest2@e9e54c2

public static void main(String[] args) throws Exception {

    MyTest18 myTest = new MyTest18("loader18");
    //myTest.setPath("E:\\gitSpace\\jdk8\\out\\production\\classes\\");
    myTest.setPath("c:\\");

    Class<?> clazz = myTest.loadClass("jvm.classloader.MyTest2");
    System.out.println("class: " + clazz);
    System.out.println("class.hashCode: " + clazz.hashCode());
    Object object = clazz.newInstance();
    System.out.println(object);
    System.out.println("--------------------------------");

    MyTest18 myTest2 = new MyTest18(myTest, "loader18");
    //myTest.setPath("E:\\gitSpace\\jdk8\\out\\production\\classes\\");
    myTest2.setPath("c:\\");

    Class<?> clazz2 = myTest2.loadClass("jvm.classloader.MyTest2");
    System.out.println("class2: " + clazz2);
    System.out.println("class2.hashCode: " + clazz2.hashCode());
    Object object2 = clazz2.newInstance();
    System.out.println(object2);

    System.out.println("--------------------------------");

    MyTest18 myTest3 = new MyTest18(myTest2, "loader19");
    //myTest.setPath("E:\\gitSpace\\jdk8\\out\\production\\classes\\");
    myTest3.setPath("c:\\");

    Class<?> clazz3 = myTest3.loadClass("jvm.classloader.MyTest2");
    System.out.println("class3: " + clazz3);
    System.out.println("class3.hashCode: " + clazz3.hashCode());
    Object object3 = clazz3.newInstance();
    System.out.println(object3);
  }
此示例没删除MyTest2.class则输出如下
第2个加载器加载的是父类的,第3个加载时,在1中已经加载过,所以3者是加载的同个类

className: jvm.classloader.MyTest2
classLoaderName: loader18
loadClassData.222.........
fileName: c:\jvm\classloader\MyTest2.class
class: class jvm.classloader.MyTest2
class.hashCode: 135721597
jvm.classloader.MyTest2@87aac27


class2: class jvm.classloader.MyTest2
class2.hashCode: 135721597
jvm.classloader.MyTest2@3e3abc88


class3: class jvm.classloader.MyTest2
class3.hashCode: 135721597
jvm.classloader.MyTest2@6ce253f1

相关文章

  • 【JAVA】京东一面

    1、类加载机制概念、加载步骤、双亲委托机制、全盘委托机制、类加载器种类及继承关系 2、如何实现让类加载器去加载网络...

  • 3.类加载器三双亲委托机制

    双亲委托机制 在双亲委托机制中,各个加载器按照父子关系形成了树形结构,除了根类加载器之外,其余的类加载器都有且只有...

  • 四、初识ClassLoader

    双亲委派的定义 类加载器的父亲委托机制(双亲委派机制) 类加载器加载一个类时,会优先交给其父的加载器加载,父加载器...

  • jvm(二)类加载过程与类加载器

    本篇内容: 类加载过程 类加载器分类 双亲委托机制 沙箱安全机制 类加载过程 类加载器子系统负责将从文件系统或者网...

  • Android的类加载器

    Android的ClassLoader与java的ClassLoader有些差异, 双亲委托机制某个类加载器在加载...

  • 源码讲解双亲委托如何被破坏

    什么是双亲委托 双亲委托是类加载器的一个特性,当加载一个类的时候,首先会委托父加载器去加载,如果父加载器加载不到,...

  • Android-类加载

    双亲委托机制 类在进行类加载的时候,把加载任务托管给父类加载器,如能加载成功,则返回,否则依次向子类加载器递归尝试...

  • 双亲委派

    JVM在加载类时默认采用的是双亲委派机制。 某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器...

  • 谈谈 --JAVA 的双亲委派机制及作用

    什么是双亲委派机制 当某个类加载器需要加载某个.class文件时,它首先把这个任务委托给他的上级类加载器,递归...

  • 面试官:java双亲委派机制及作用

    什么是双亲委派机制 当某个类加载器需要加载某个.class文件时,它首先把这个任务委托给他的上级类加载器,递归这个...

网友评论

      本文标题:类加载器双亲委托机制

      本文链接:https://www.haomeiwen.com/subject/nnguoctx.html