java面试一日一题:java的类加载过程
2021-06-06 03:06
标签:结构 字节 加载 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
文章标题:java面试一日一题:java的类加载过程
文章链接:http://soscw.com/index.php/essay/91099.html