1. 以下是Classloader的中最重要的方法,也就是所谓的双亲委派模型。这个模型第一次在周志明的书上看到,当时看了只知道是类加载过程是首先是委托给父加载器,否则父不能加载,则自己加载,整个过程实则是一个很简单的递归过程,本文以实例讲解这个模型到底是咋实现的?
  2.  
  3. protected Class<?> loadClass(String name, boolean resolve)
  4. throws ClassNotFoundException
  5. {
  6. synchronized (getClassLoadingLock(name)) {
  7. // First, check if the class has already been loaded
  8. Class c = findLoadedClass(name);
  9. if (c == null) {
  10. long t0 = System.nanoTime();
  11. try {
  12. if (parent != null) {
  13. c = parent.loadClass(name, false);
  14. } else {
  15. c = findBootstrapClassOrNull(name);
  16. }
  17. } catch (ClassNotFoundException e) {
  18. // ClassNotFoundException thrown if class not found
  19. // from the non-null parent class loader
  20. }
  21.  
  22. if (c == null) {
  23. // If still not found, then invoke findClass in order
  24. // to find the class.
  25. long t1 = System.nanoTime();
  26. c = findClass(name);
  27.  
  28. }
  29. }
  30. if (resolve) {
  31. resolveClass(c);
  32. }
  33. return c;
  34. }
  35. }

类加载器用来测试的Class文件对应的类

  1. public class TestLoaderClass {
  2. public TestLoaderClass()
  3. {
  4. System.out.println("加载器为"+TestLoaderClass.class.getClass());
  5.  
  6. }
  7.  
  8. }
  9.  
  1. //自定义类加载器
    import java.io.ByteArrayOutputStream;
  2. import java.io.File;
  3. import java.io.FileInputStream;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import java.nio.ByteOrder;
  7.  
  8. public class MyClassLoader extends ClassLoader {
  9.  
  10. //类加载器名称
  11. private String name;
  12. //加载类的路径
  13. private String path = "D:/";
  14. private final String fileType = ".class";
  15. public MyClassLoader(String name){
  16. //让系统类加载器成为该 类加载器的父加载器
  17. super();
  18. this.name = name;
  19. }
  20.  
  21. //显示设置类加载器的父类加载器
  22. public MyClassLoader(ClassLoader parent, String name){
  23. //显示指定该类加载器的父加载器
  24. super(parent);
  25. this.name = name;
  26. }
  27.  
  28. public String getPath() {
  29. return path;
  30. }
  31.  
  32. public void setPath(String path) {
  33. this.path = path;
  34. }
  35.  
  36. @Override
  37. public String toString() {
  38. return this.name;
  39. }
  40.  
  41. /**
  42. * 获取.class文件的字节数组
  43. * @param name
  44. * @return
  45. */
  46.  
  47. /**
  48. * 获取Class对象
  49. * @throws IOException
  50. */
  51. private byte[] getBytes(String name) throws IOException
  52. {
  53. //name=name.replace(".", "/");
  54. File f=new File(path+name+fileType);
  55. InputStream in=new FileInputStream(f);
  56. System.out.println(in.available()+"file");
  57. ByteArrayOutputStream bao=new ByteArrayOutputStream();
  58. int r=in.read();
  59. while(r!=-1)
  60. {
  61. bao.write(r);
  62. r=in.read();
  63.  
  64. }
  65. System.out.println(bao.toByteArray().toString());
  66. return bao.toByteArray();
  67.  
  68. }
  69. public Class<?> findClass(String name){
  70. byte[] data = null;
  71. try {
  72. data = getBytes(name);
  73. } catch (IOException e) {
  74. // TODO Auto-generated catch block
  75. e.printStackTrace();
  76. }
  77. System.out.println();
  78. return this.defineClass(name, data, 0, data.length);
  79. }
  80.  
  81. public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
  82. //loader1的父加载器为系统类加载器
  83. MyClassLoader loader1 = new MyClassLoader("loader1");
  84. loader1.setPath("D:/lib1/");
  85. //loader2的父加载器为loader1
  86. MyClassLoader loader2 = new MyClassLoader(loader1, "loader2");
  87. loader2.setPath("D:/lib2/");
  88. //loader3的父加载器为根类加载器
  89. MyClassLoader loader3 = new MyClassLoader(loader2, "loader3");
  90. loader3.setPath("D:/lib3/");
  91.  
  92. Class<?> clazz = loader3.loadClass("TestLoaderClass");
  93. System.out.println(clazz.getClassLoader());
  94. ClassLoader cl=loader3;
  95.  
  96. }
  97. }

java双亲委派模型如何递归实现的更多相关文章

  1. Java 双亲委派模型

    1. Java 类加载器的分类 2. 双亲委派模型 Parents Delegration Model

  2. java双亲委派模型

    Java类加载器(ClassLoader) 双亲委派模式要求除了顶层的启动类加载器外,其余的类加载器都应当有自己的父类加载器,请注意双亲委派模式中的父子关系并非通常所说的类继承关系,而是采用组合关系来 ...

  3. java虚拟机类加载机制和双亲委派模型

    java虚拟机类加载机制:虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的java类型. 类的生命周期是从类被加载到虚拟机内存中,到卸 ...

  4. Java自定义类加载器与双亲委派模型

    其实,双亲委派模型并不复杂.自定义类加载器也不难!随便从网上搜一下就能搜出一大把结果,然后copy一下就能用.但是,如果每次想自定义类加载器就必须搜一遍别人的文章,然后复制,这样显然不行.可是自定义类 ...

  5. java类加载器和双亲委派模型

    一. 类加载器 ClassLoader即常说的类加载器,其功能是用于从Class文件加载所需的类,主要场景用于热部署.代码热替换等场景. 系统提供3种的类加载器:Bootstrap ClassLoad ...

  6. @Java类加载器及双亲委派模型

    类与类加载器 虚拟机设计团队把类加载阶段的"通过一个类的全限定名来获取此类的二进制字节流"这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类.实现这个 ...

  7. 深入理解java虚拟机(九)类加载器以及双亲委派模型

    虚拟机把类加载阶段中“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到虚拟机外部去实现,以便让程序自己决定如何去获取所需要的类.实现这个动作的代码模块称为“类加载器”. 类与类加载器 任 ...

  8. Java面试题之类加载器有哪些?什么是双亲委派模型

    类加载器有哪些: 1.启动类加载器(Bootstrap ClassLoader):这个类加载器负责将存放在<JAVA_HOME>\lib目录中的,或被-Xbootclasspath参数所指 ...

  9. java虚拟机(二)--类加载机制和双亲委派模型

    一.类的生命周期 加载(Loading).验证(Verification).准备(Preparation).解析(Resolution).初始化(Initialization).使用(Using).卸 ...

随机推荐

  1. HDFS 的可靠性

    HDFS 的可靠性主要有一下几点: 冗余副本策略 机架策略 心跳机制 安全模式 效验和 回收站 元数据保护 快照机制 1.冗余副本策略 可以在hdfs-site.xml中设置复制因子指定副本数量 所有 ...

  2. CQRS学习——Cqrs补丁,async实验以及实现[其二]

    实验——async什么时候提高吞吐 async是一个语法糖,用来简化异步编程,主要是让异步编程在书写上接近于同步编程.总的来收,在await的时候,相当于附加上了一个.ContinueWith(). ...

  3. Matlab实现ItemBasedCF算法

    感谢开源大神,慢慢收集资料.网上资料很少,我在找如何用matlab处理movielens数据集时找到的. 用ml-100k这个数据集,包括主函数和相似度函数. 代码托管于CSDN.

  4. hibernate hql 大全

    Hibernate配备了一种非常强大的查询语言,这种语言看上去很像SQL.但是不要被语法结构 上的相似所迷惑,HQL是非常有意识的被设计为完全面向对象的查询,它可以理解如继承.多态 和关联之类的概念. ...

  5. 建立Clojure开发环境-使用IDEA和Leiningen

    OS: Mac OS X 10.10 IDEA 14.0.2 Community Edition 安装Leiningen 按照http://leiningen.org/的指南安装lein 阅读Lein ...

  6. 安装ADT Cannot complete the install because one or more required items could not be found.

    点击进行安装,将会弹出 错误提示是: Cannot complete the install because one or more required items could not be found ...

  7. android dialog点击其他区域消失

    只需调用dialog对象的setCanceledOnTouchOutside方法,传入参数为true即可. 如下代码实现: //点击其他区域dialog消失 menuDialog.setCancele ...

  8. SSH配置log4j的方法

    SSH使用log4j的方便之处 1. 动态的改变记录级别和策略,即修改log4j.properties,不需要重启Web应用,这需要在web.xml中设置一下.2. 把log文件定在 /WEB-INF ...

  9. jquery ajax 访问webServer的xml文件

    最近项目中要使用到通过ajax访问webServer的xml文件,通过下面的方式可以直接访问webServer的xml文件,不需要在web.xml中进行任何配置.它的返回参数就是服务器上的xml文件. ...

  10. Nginx-location配置指南

    语法规则: location [=|~|~*|^~] /uri/ { … } = 开头表示精确匹配 ^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可.nginx不对url做编码,因 ...