java面试一日一题:java的类加载过程

2021-06-06 03:06

阅读:530

标签:结构   字节   加载   interface   bootstra   nbsp   抽象   程序   用户   

问题:请讲下java的类加载机制及过程

分析:该问题主要考察对JVM加载类的机制及过程,延申出的问题是为什么使用双亲委托模型,有什么办法可以打破双亲委托吗;

回答要点:

主要从以下几点去考虑,

1、类加载的过程?

2、类加载的机制?

3、如何打破双亲委托模型?

 

在运行java程序时,一个类必须要加载到内存中才可以被使用,那么这个加载的过程是什么样子的那

类加载的过程分为下面三个阶段

加载

所谓加载,就是把字节码文件(java编译器会把源文件编译为字节码文件)加载到JVM中,并且映射为JVM可以识别的数据结构,也就是Class对象;字节码的来源可以是网络、数据库、jar等格式,这个过程是用户可以参与的过程,可以自定义类加载器实现加载的过程;

连接

这一步是核心的过程,要把上个阶段的Class文件,转化为JVM运行时的数据结构,分为三个步骤,验证、准备、解析;

验证

验证主要是验证字节码是否符合JVM虚拟机的规范,主要从安全方面进行考虑。

准备

准备阶段主要是针对类或接口中的静态变量,对类变量进行创建并赋初值,这里的初值是对应的类型的默认值;

解析

将符号引用转化为直接引用

初始化

执行类初始化的操作,包括静态变量的赋值,静态代码块的执行等;

 

上面说了类加载的过程,那么一个类加载的机制是什么那

java中类加载遵循双亲委托模型。类加载首先要有类加载器,java提供了3种类加载器,bootstrapClassLoader、ExtClassLoader、ApplicationClassLoader,其中bootstrapClassLoader没有父加载器。一个类被加载时,默认情况下会使用ApplicationClassLoader进行加载,ApplicationClassLoader会查找自己的缓存,如果换成中没加载过该类,则会委托给其父类加载器ExtClassLoader去加载,ExtClassLoader同样去查找自己的缓存,如果缓存中没有则委托给其父类BoostrapClassLoader去加载,BootstrapClassLoader查找自己的缓存,如果缓存中没有,则它会尝试自己去加载(它没有父加载器),如果它加载不了,则交给ExtClassLoader去加载,ExtClassLoader无法加载的话,就会交给ApplicaitonClassLoader去加载,如果都加载不了的话则会抛出异常。

使用双亲委托的好处就是防止类被重复加载,保证一个类只能由一个类加载器加载;保证JDK类库的安全;

 

如何打破双亲委托那

1、可以自定义类加载器,继承抽象类ClassLoader,重写其loadClass方法,该方法中实现的就是双亲委托的代码;同时要重写因为该方法是一个抽象方法,需要定义该类从什么地方加载字节码;

2、SPI机制,service provider interface 是一套接口,这套接口由java来提供,但是具体实现由第三方来提供,例如,java.sql包就定义了一组数据库访问规范,但是并没有提供具体的实现,具体的实现由各数据库厂商提供;

 

java面试一日一题:java的类加载过程

标签:结构   字节   加载   interface   bootstra   nbsp   抽象   程序   用户   

原文地址:https://www.cnblogs.com/teach/p/14615926.html


评论


亲,登录后才可以留言!