深入理解Java虚拟机(8)

来源:互联网 发布:绿盾加密软件 编辑:程序博客网 时间:2024/06/09 20:57

这个系列文章是对《深入理解Java虚拟机》一书的笔记及个人理解

类加载器用于实现类的加载动作。对于任意一个类,需要由类加载器及类本身一同确立其在Java虚拟机中的唯一性。通俗地说就是同一个类加载器的加载范围内,类只会被加载一次,但在不同的类加载器中,类会被多次加载。

类加载器分为两种:

  1. 启动类加载器(Bootstrap ClassLoader),这个类加载器使用C++语言实现,是虚拟机的一部分,启动类加载器无法被Java程序直接引用。

  2. 其它类加载器,这些类加载器都由Java语言实现,独立于虚拟机外部,并且全部继承自抽象类 java.lang.ClassLoader。

其它类加载器中有两个非常重要的代表。

  1. 扩展类加载器(Extension ClassLoader),负责加载$JAVA_HOME/lib/ext目录下的类库

  2. 应用程序类加载器(Application ClassLoader),这个类加载器是ClassLoader类中getSystemClassLoader方法的返回值,所以也称为系统类加载器。负责加载用户类路径(ClassPath)上所指定的类库。如果应用程序中没有自定义过其它类加载器,一般情况下这个就是默认的类加载器。

双亲委派模型

在类加载器之间,设计有一种层次关系,称之为双亲委派模型。

模型要求除了顶层的启动类加载器外,其余的类加载器都应当有自己的父类加载器(类加载器之间的父子关系并不是以继承的关系来实现,而是以组合的关系来实现)。

模型的工作过程是:

类加载器收到类加载的请求,它首先不是自己去尝试加载,而是将这个类委派给父类加载器去完成,中间每一个层次的类加载器都是这么做的,因此所有的加载请求最终都应该传送到顶层的启动类加载器,只有当父加载器反馈自己无法完成这个加载请求时,子加载器才会尝试自己去加载。

破坏双亲委派模型的场景

1、 线程上下文类加载器
这个类加载器可以通过Thread类的setContextClassLoader()方法进行设置,如果创建线程时还未设置,它将会从父线程中继承一个,如果应用程序全局范围内都没有设置过,那么这个类加载器默认就是应用程序类加载器。

有了这个类加载器,可以实现父类加载器请求子类加载器去完成类加载的动作,这种行为实际上就是打通了双亲委派模型的层次结构,逆向使用类加载器。

2、代码热替换、程序热部署

原创粉丝点击