A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© xkfxm 中级黑马   /  2013-8-8 12:45  /  1260 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 xkfxm 于 2013-8-9 12:23 编辑

Java虚拟机中可以安装多个类加载器,系统默认的三个主要类加载器,每个类负责加载特定位置的类:BootStrap    ExtClassLoader   AppClassLoader
他们都是嵌套在虚拟机中的吗?还是只有BootStrap是?后面两个是不是java类?为什么在API中找不到?

这两段代码中,第一个是获取普通自定义类的类加载器的名称;第二个是获取自定义类加载器(继承ClassLoader)的父类加载器名称。
为什么自定义类加载器继承的是ClassLoader而输出他的父类却是AppClassLoader?

3 个回复

正序浏览
崔一恒 发表于 2013-8-8 22:59
网上找了点,共同学习,捡有用的吧。嗯嗯。
Java 中的类加载器大致可以分成两类,一类是系统提供的,另外一 ...

恩恩   谢谢   
回复 使用道具 举报
网上找了点,共同学习,捡有用的吧。嗯嗯。
Java 中的类加载器大致可以分成两类,一类是系统提供的,另外一类则是由 Java 应用开发人员编写的。系统提供的类加载器主要有下面三个:
引导类加载器(bootstrap class loader):它用来加载 Java 的核心库,是用原生代码来实现的,并不继承自 java.lang.ClassLoader。
扩展类加载器(extensions class loader):它用来加载 Java 的扩展库。Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java 类。
系统类加载器(system class loader):它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类。一般来说,Java 应用的类都是由它来完成加载的。可以通过 ClassLoader.getSystemClassLoader()来获取它。
除了系统提供的类加载器以外,开发人员可以通过继承 java.lang.ClassLoader类的方式实现自己的类加载器,以满足一些特殊的需求。
除了引导类加载器之外,所有的类加载器都有一个父类加载器。通过 表 1中给出的 getParent()方法可以得到。对于系统提供的类加载器来说,系统类加载器的父类加载器是扩展类加载器,而扩展类加载器的父类加载器是引导类加载器;对于开发人员编写的类加载器来说,其父类加载器是加载此类加载器 Java 类的类加载器。因为类加载器 Java 类如同其它的 Java 类一样,也是要由类加载器来加载的。一般来说,开发人员编写的类加载器的父类加载器是系统类加载器。类加载器通过这种方式组织起来,形成树状结构。树的根节点就是引导类加载器。图 1中给出了一个典型的类加载器树状组织结构示意图,其中的箭头指向的是父类加载器。

一般来说,自己开发的类加载器只需要覆写 findClass(String name)方法即可。java.lang.ClassLoader类的方法 loadClass()封装了前面提到的代理模式的实现。该方法会首先调用 findLoadedClass()方法来检查该类是否已经被加载过;如果没有加载过的话,会调用父类加载器的 loadClass()方法来尝试加载该类;如果父类加载器无法加载该类的话,就调用 findClass()方法来查找该类。因此,为了保证类加载器都正确实现代理模式,在开发自己的类加载器时,最好不要覆写 loadClass()方法,而是覆写 findClass()方法。所以父类是AppClassLoader。
至于api中为什么没有我也不清楚,我自己感觉可能一般来说,Java 应用的开发人员不需要直接同类加载器进行交互,并且后两种加载器已经固定,sun就进行了保护吧。
回复 使用道具 举报
代码
  1. System.out.println(
  2.                                 ClassLoaderTest.class.getClassLoader().getClass().getName());
  3.                 //sun.misc.Launcher$$AppClassLoader

  4. System.out.println( new MyClassLoader("itcastlib").getParent());
  5. //sun.misc.Launcher$$AppClassLoader@1016632
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马