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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马王冬冬 中级黑马   /  2012-7-25 15:24  /  1929 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. package com.itheima;

  2. public class ClassLoaderTest {
  3.         public static void main(String[] args){
  4.                 System.out.println(
  5.                 ClassLoaderTest.class.getClassLoader().getClass().getName() //位置1
  6.                 +"\n"+System.class.getClassLoader());
  7.                
  8.                 ClassLoader loader = ClassLoaderTest.class.getClassLoader();
  9.                 while(loader != null) {
  10.                         System.out.println(loader.getClass().getName());//位置2
  11.                         loader = loader.getParent();
  12.                 }
  13.                 System.out.println(loader);
  14.         }
  15.                 }
复制代码
输出结果是,
sun.misc.Launcher$AppClassLoader
null
sun.misc.Launcher$AppClassLoader
sun.misc.Launcher$ExtClassLoader
null
我的疑问是在位置1和位置2,为何ClassLoaderTest.class.getClassLoader()最后的输出结果分别为sun.misc.Launcher$AppClassLoader和sun.misc.Launcher$AppClassLoader,sun.misc.Launcher$ExtClassLoader?为何多出一个sun.misc.Launcher$ExtClassLoader?



评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

2 个回复

倒序浏览
ClassLoader它就是用来加载Class文件到JVM,以供程序使用的。
bootstrap classloader(启动类加载器)是用C语言所编写的,没有对应的java Object,而是JVM实现的一部分,。
这个ClassLoader在JVM运行的时候加载java核心的API以满足java程序最基本的需求,其中就包括用户定义的ClassLoader。用户定义
是指通过java程序实现的ClassLoader,一个是ExtClassLoader,这个ClassLoader是用来加载java的扩展API的,也就是/lib/ext中
的类,一个是AppClassLoader,这个ClassLoader是用来加载用户机器上CLASSPATH设置目录中的Class的,通常在没有指定
ClassLoader的情况下,程序员自定义的类就由该ClassLoader进行加载。

1.ClassLoaderTest.class.getClassLoader().getClass().getName()是获取ClassLoaderTest.class类加载器的名字,即
AppClassLoader(加载class的)。
2.System.class.getClassLoader() 输出为null, 这是因为AppClassLoader的父加载器虽然是ExtClassLoader,但是却是Bootstrap
加载的(所以它的.getClassLoader()返回为null)
3.ClassLoader loader = ClassLoaderTest.class.getClassLoader();
  loader.getClass().getName()
当运行一个程序的时候,JVM启动,运行bootstrap classloader,该ClassLoader加载java核心API(ExtClassLoader和
AppClassLoader也在此时被加载),然后调用ExtClassLoader加载扩展API,最后AppClassLoader加载CLASSPATH目录下定义的Class
,这就是一个程序最基本的加载流程。
所以打印出sun.misc.Launcher$AppClassLoader,sun.misc.Launcher$ExtClassLoader
4.最后loader = loader.getParent();再次去获取bootstrap classloader即启动加载器的对象则得到null.
来段形象的解释:
Bootstrap是爷爷、ExtClassLoader是爸爸、AppClassLoader是孩子(孙子)。但由于爸爸ExtClassLoader太忙了,所以照顾孩子
AppClassLoader的责任就有爷爷Bootstrap来处理了(即,虽然ExtClassLoader是AppClassLoader老爸,但却是由爷爷Bootstrap加载
的AppClassLoader。

代码举例见ClassLoader.png

ClassLoader.png (41.54 KB, 下载次数: 25)

类加载器

类加载器

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马