Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1658132
  • 博文数量: 695
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 4027
  • 用 户 组: 普通用户
  • 注册时间: 2013-11-20 21:22
文章分类

全部博文(695)

文章存档

2018年(18)

2017年(74)

2016年(170)

2015年(102)

2014年(276)

2013年(55)

分类: Java

2016-07-27 10:57:06

1. 自定义类装载器何时使用?

    Java应用程序能够在运行时安装用户自定义的类装载器,这种类装载器能够使用自定义的方式来装载类,例如,从网络下载class文件,从数据库获取, 甚至可以动态生成。(比如在编程的时候,需要用到从网上下载的一个class文件中的方法,这时候需要使用用户自定义类加载器实现,见:http://blog.csdn.net/huangbiao86/article/details/6910152尽管启动类装载器是虚拟机实现的本质部分,而用户自定义的类装载器不是;但是用户自定义的类装载器能够用java编写,能够被编译为 class文件,能够被虚拟机装载,还能够像其他对象一样实例化。他们实际上只是运行中的java应用程序可以执行代码的一部分。至此应该明白自定义类装 载器应该何时使用了。对于需要动态加载java文件,可以使用用户自定义类加载器。由于有自定义类装载器的存在,使得在运行时扩展java应用程序成为可能。

             再多说两句,每一个类被装载的时候,Java虚拟机都件事这个类,看他到底是被启动类装载器还是被用户定义类装载器装载。当被装载的类引用了另外一个类时,虚拟机就会使用装载第一个类的类装载器装载被引用的类。
 一、类加载器类别 
 *  1.java虚拟机自带的加载器 
 *   根类加载器(Bootstrap,c++实现) 
 *    扩展类加载器(Extension,java实现) 
 *    系统类加载器(System,java实现) 
 *  2.用户自定义的类加载器 
 *    java.lang.ClassLoader的子类 

 *    用户可以定制类的加载方式2.JVM运行时的ClassLoader介绍

 
http://boy00fly.iteye.com/blog/1096912

JVM在运行时会产生三个ClassLoader:Bootstrap ClassLoaderExtension ClassLoaderAppClassLoader. 其中,Bootstrap是用C++编写的,我们在Java中看不到它,是null。它用来加载核心类库,在JVM源代码中这样写道: static const char classpathFormat[] = "%/lib/rt.jar:" "%/lib/i18n.jar:" "%/lib/sunrsasign.jar:" "%/lib/jsse.jar:" "%/lib/jce.jar:" "%/lib/charsets.jar:" "%/classes"; Extension ClassLoader用来加载扩展类,即/lib/ext中的类。 最后AppClassLoader才是加载Classpath的。 ClassLoader加载类用的是委托模型。即先让Parent类(而不是Super,不是继承关系)寻找,Parent找不到才自己找。 三者的关系为:AppClassLoader的Parent是ExtClassLoader,而ExtClassLoader的Parent为Bootstrap ClassLoader。 加载一个类时,首先BootStrap先进行寻找,找不到再由ExtClassLoader寻找,最后才是AppClassLoader。 为什么要设计的这么复杂呢?其中一个重要原因就是安全性。比如在Applet中,如果编写了一个java.lang.String类并具有破坏性。 假如不采用这种委托机制,就会将这个具有破坏性的String加载到了用户机器上,导致破坏用户安全。但采用这种委托机制则不会出现这种情况。 因为要加载java.lang.String类时,系统最终会由Bootstrap进行加载,这个具有破坏性的String永远没有机会加载




阅读(946) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~