xsm--海阔天空
JAVA AND DocNET!

JAVA类装载器

顾名思义,类装载器是用来把类 (class) 装载进 JVM 的。 JVM 规范定义了两种类型的类装载器:启动内装载器 (bootstrap) 和用户自定义装载器 (user-defined class loader) 。

 

JVM 的类动态装载技术能够在运行时刻动态地加载或者替换系统的某些功能模块 , 而不影响系统其他功能模块的正常运行。

 

装载就是寻找一个类或是一个接口的二进制形式并用该二进制形式来构造代表这个类或是这个接口的 class 对象的过程,其中类或接口的名称是给定了的。当然名称也可以通过计算得到,但是更常见的是通过搜索源代码经过编译器编译后所得到的二进制形式来构造。

  在 Java 中,类装载器把一个类装入 Java 虚拟机中,要经过 三个步骤 来完成:装载、链接和初始化,其中链接又可以分成校验、准备和解析三步,除了解析外,其它步骤是严格按照顺序完成的,各个步骤的主要工作如下:

  装载:查找和导入类或接口的二进制数据;

  链接:执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的;

  校验:检查导入类或接口的二进制数据的正确性;

  准备:给类的静态变量分配并初始化存储空间;

  解析:将符号引用转成直接引用;

  初始化:激活类的静态变量的初始化 Java 代码和静态 Java 代码块。

 

bootstrap 是 JVM 自带的类装载器,用来装载核心类库,如 java.lang.* 等。由例 1 可以看出, java.lang.Object 是由 bootstrap 装载的。

 

Java 提供了抽象类 ClassLoader ,所有用户自定义类装载器都实例化自 ClassLoader 的子类。

System Class Loader 是一个特殊的用户自定义类装载器,由 JVM 的实现者提供,在编程者不特别指定装载器的情况下默认装载用户类。系统类装载器可以通过 ClassLoader.getSystemClassLoader() 方法得到。

 

例 1 ,测试你所使用的 JVM 的 ClassLoader

/*LoaderSample1.java*/

public class LoaderSample1

{

       public static void main(String[] args)

       {

              Class c;

              ClassLoader cl;

             

              cl = ClassLoader.getSystemClassLoader();

              System.out.println(cl);

             

              while (cl != null)

              {

                     cl = cl.getParent();

                     System.out.println(cl);         

              }

 

              try

              {

                     c = Class.forName(“java.lang.Object”);

                     cl = c.getClassLoader();

                     System.out.println(“java.lang.Object’s loader is ” + cl);

 

                     c = Class.forName(“LoaderSample1”);

cl = c.getClassLoader();

                     System.out.println(“LoaderSample1’s loader is ” + cl);

              }

              catch (Exception e)

              {

                     e.printStackTrace();

}

       }

}

 

在我的机器上 (Sun Java 1.4.2) 的 运行结果

sun.misc.Launcher$AppClassLoader@1a0c10f

sun.misc.Launcher$ExtClassLoader@e2eec8

null

java.lang.Object's loader is null

LoaderSample1's loader is sun.misc.Launcher$AppClassLoader@1a0c10f

 

第一行表示,系统类装载器实例化自类 sun.misc.Launcher$AppClassLoader

第二行表示,系统类装载器的 parent 实例化自类 sun.misc.Launcher$ExtClassLoader

第三行表示,系统类装载器 parent 的 parent 为 bootstrap

第四行表示,核心类 java.lang.Object 是由 bootstrap 装载的

第五行表示,用户类 LoaderSample1 是由系统类装载器装载的

发表于 2006-12-20 11:07 xsm 阅读(983) 评论(2)  编辑  收藏 所属分类: J2SE
 
评论
# re: JAVA类装载器
例子很好!
久城 评论于 2007-04-08 17:45  回复  更多评论    
# re: JAVA类装载器
恩,例子很好
JA 评论于 2008-08-04 11:45  回复  更多评论    
 
新用户注册  刷新评论列表  

只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问   管理
相关文章:
  • JAVA类装载器
  • 关于Java栈与堆的思考
 
 
<2008年8月>
日一二三四五六
272829303112
3456789
10111213141516
17181920212223
24252627282930
31123456

 导航

  • BlogJava
  • 首页
  • 发新随笔
  • 发新文章
  • 联系
  • 聚合
  • 管理

 统计

  • 随笔: 7
  • 文章: 1
  • 评论: 18
  • 引用: 0

常用链接

  • 我的随笔
  • 我的评论
  • 我的参与
  • 最新评论

留言簿(1)

  • 给我留言
  • 查看公开留言
  • 查看私人留言

随笔分类(8)

  • IT心得(3) (rss)
  • J2EE(3) (rss)
  • J2ME (rss)
  • J2SE(2) (rss)

随笔档案(7)

  • 2007年11月 (1)
  • 2007年4月 (2)
  • 2006年12月 (4)

搜索

  •  

积分与排名

  • 积分 - 15414
  • 排名 - 1980

最新评论

  • 1. re: 关于JAVA的PO与VO
  • @somewhereyu

    直接继承的话,如果有的情况VO需要里面有包含两个PO的属性,怎么弄?
  • --杨彩
  • 2. re: 关于JAVA的PO与VO
  • 做个vo extends po不就得了。

    在api调用传递参数时,可以将参数中不在数据表中的字段放到vo中。
  • --somewhereyu
  • 3. re: 关于JAVA的PO与VO
  • 我是想弄明白什么是VO,PO,DAO之类的东西了,看后有了一点的了解了,thanks!
  • --张红艳
  • 4. re: JAVA类装载器
  • 恩,例子很好
  • --JA
  • 5. re: 使用hibernate+DAO组件(1)
  • 说也下呗
  • --huo

阅读排行榜

  • 1. 关于JAVA的PO与VO(10884)
  • 2. 我学习JAVA的心得(1030)
  • 3. JAVA类装载器(983)
  • 4. 使用hibernate+DAO组件(1)(646)
  • 5. JBuilder2005+ JBoss 开发CMP学习笔记(568)

评论排行榜

  • 1. 关于JAVA的PO与VO(9)
  • 2. 我学习JAVA的心得(4)
  • 3. JAVA类装载器(2)
  • 4. 关于Java栈与堆的思考(1)
  • 5. 使用hibernate+DAO组件(1)(1)

Powered by: 博客园
模板提供:沪江博客
Copyright ©2025 xsm