深入理解JVM-虚拟机类加载机制(类加载器)
虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块称为“类加载器”
比较两个类是否相等,只能有一个类加载器加载的前提下才有意义。否则,即使这两个类来源于同一个class文件,被同一个虚拟机加载,只要加载他们的类加载器不同,那么两个类一定不同。
双亲委派模型
-
启动类加载器:bootstrap classloader
负责加载lib目录下或者被-xbootclasspath制定的路径中。
-
扩展类加载器:extension classloader
负责加载lib\ext目录中,或者被java.ext.dirs制定的路径。
应用程序类加载器:这个类加载器是classloader中getsystemclassloader方法的返回值。
自定义类加载器
双亲委派模型要求除了顶层的启动类加载器外,其余的类加载器都应当有自己的父类加载器。这里类加载器之间的父子关系是以组合来实现的。
工作过程:如果一个类加载器收到了类加载的请求。它首先不会自己去尝试加载这个类。而是把这个请求委派给父类加载器。每一个层次的类加载器都是如此。因此所有的加载请求,最终都应该传送到顶端的启动类加载器中,只有当父亲反馈自己无法完成这个请求。子加载器材尝试自己加载。
好处:
- java类随着类加载器具有了优先级的层次关系。
- 安全