类加载

2019-07-30  本文已影响0人  Jokay

一、类加载的过程是怎么样的?

  1. 加载: 通过类的全限定名获取该类的二进制字节流,并在内存中为之创建一个java.lang.Class对象
  2. 连接

2.1. 验证:用于检验被加载的类是否有正确的内部结构,并和其他类协调一致,主要为了确保虚拟机自身安全。大致包括四种验证:文件格式验证,元数据验证,字节码验证,符号引用验证。

2.2. 准备:为类的静态变量分配内存,并设置默认初始值

2.3. 解析:将类的二进制数据中的符号引用替换成直接引用

  1. 初始化:执行类构造器<clinit>()方法的过程。为类的静态变量(即类变量)赋予正确的初始值。

二、两个不同的类加载器加载同一个类,如何进行区分和隔离?

双亲委派模型:如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行,如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器,如果父类加载器可以完成类加载任务,就成功返回,倘若父类加载器无法完成此加载任务,子加载器才会尝试自己去加载。


双亲委派机制可以避免类的重复加载、防止核心API库被随意篡改。

在Java虚拟机中,即便是同样的字节代码,被不同的类加载器加载之后所得到的类,也是不同的。

在类加载器的灵活应用:web容器Tomcat、OSGI

上一篇下一篇

猜你喜欢

热点阅读