Java的ClassLoader就是用来动态装载class的,ClassLoader对一个class只会装载一次,JVM使用的ClassLoader一共有4种:
启动类装载器,标准扩展类装载器,类路径装载器和网络类装载器。
这
4种ClassLoader的优先级依次从高到低,使用所谓的“双亲委派模型”。
初秋日本街拍发型确切地说,如果一个网络类装载器被请求装载一个
java.lang.Integer,它会首先把请求发送给上一级的类路径装载器,如果返回已装载,则网络类装载器将不会装载这个
java.lang.Integer,如果上一级的类路径装载器返回未装载,它才会装载java.lang.Integer。
类似的,类
路径装载器收到请求后(无论是直接请求装载还是下一级的ClassLoader上传的请求),它也会先把请求发送到上一级的标准扩展类装载器,这样一层一
层上传,于是启动类装载器优先级最高,如果它按照自己的方式找到了java.lang.Integer,则下面的ClassLoader都不能再装载
java.lang.Integer,尽管你自己写了一个java.lang.Integer,试图取代核心库的java.lang.Integer是不
可能的,因为自己写的这个类根本无法被下层的ClassLoader装载。
再说说Package权限。Java语言规定,在同一个包中的
class,如果没有修饰符,默认为Package权限,包内的class都可以访问。但是这还不够准确。确切的说,只有由同一个ClassLoader
装载的class才具有以上的Package权限。比如启动类装载器装载了java.lang.String,类路径装载器装载了我们自己写的
java.lang.Test,它们不能互相访问对方具有Package权限的方法。这样就阻止了恶意代码访问核心类的Package权限方法。
-----------------
JVM
本身包含了一个ClassLoader称为Bootstrap ClassLoader,和JVM一样,Bootstrap
ClassLoader是用本地代码实现的,它负责加载核心Java
Class(即所有java.*开头的类)。另外JVM还会提供两个ClassLoader,它们都是用Java语言编写的,由Bootstrap
ClassLoader加载;其中Extension ClassLoader负责加载扩展的Java
class(例如所有javax.*开头的类和存放在JRE的ext目录下的类),Application
ClassLoader负责加载应用程序自身的类。
posted on 2010-10-31 19:37
墙头草 阅读(1406)
评论(0) 编辑 收藏