类加载器
对于任意一个类,都必须由加载它的类加载器和这个类本身一起共同确立其在Java虚拟机中的唯一性,每一个类加载器,都有一个独立的类名称空间。
比较两个类是否"相等",只有在这两个是由同一个类加载器加载的前提下才有意义。
即使这两个类来源于同一个class文件,被同一个Java虚拟机加载,只要加载他们的类加载器不同,那么这两个类就必定不相等。(这里所指的“相等”,包括代表类的Class对象的equals()方法,isAssignableFrom()方法,isInstance()方法的返回结果,也包括了使用instanceof关键字做对象所属关系判定等各种情况)
双亲委派模型
从Java虚拟机的角度来看,只有两钟不同的类加载器:
- 启动类加载器,c++语言实现,是虚拟机自身的一部分;
- 其他所有的类加载器,这些类加载器都由Java语言实现,独立存在于虚拟机外部,并且全部继承自抽象类
java.lang.ClassLoader
系统提供的类加载器:
双亲委派模型的工作过程是:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加 载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的 加载请求最终都应该传送到最顶层的启动类加载器中,只有当父加载器反馈自己无法完成这个加载请 求(它的搜索范围中没有找到所需的类)时,子加载器才会尝试自己去完成加载。
使用双亲委派模型来组织类加载器之间的关系,一个显而易见的好处就是Java中的类随着它的类 加载器一起具备了一种带有优先级的层次关系。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)