全部博文(695)
分类: 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 ClassLoader、Extension ClassLoader和AppClassLoader. 其中,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永远没有机会加载