1、ClassNotFoundExcetpion

我们在开发中,经常可以遇见java.lang.ClassNotFoundExcetpion这个异常,今天我就来总结一下这个问题。对于这个异常,它实质涉及到了java技术体系中的类加载。Java的类加载机制是技术体系中比较核心的部分,虽然它和我们直接打交道不多,但是对其背后的机理有一定理解有助于我们排查程序中出现的类加载失败等技术问题。

2、类的加载过程

一个java文件从被加载到被卸载这个生命过程,总共要经历5个阶段,JVM将类加载过程分为:  加载->链接(验证+准备+解析)->初始化(使用前的准备)->使用->卸载

(1)加载

首先通过一个类的全限定名来获取此类的二进制字节流;其次将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构;最后在java堆中生成一个代表这个类的Class对象,作为方法区这些数据的访问入口。总的来说就是查找并加载类的二进制数据。

(2)链接:

验证:确保被加载类的正确性;   准备:为类的静态变量分配内存,并将其初始化为默认值;   解析:把类中的符号引用转换为直接引用;

(3)为类的静态变量赋予正确的初始值

3、类的初始化

(1)类什么时候才被初始化

1)创建类的实例,也就是new一个对象   2)访问某个类或接口的静态变量,或者对该静态变量赋值   3)调用类的静态方法   4)反射(Class.forName(“com.lyj.load”))   5)初始化一个类的子类(会首先初始化子类的父类)   6)JVM启动时标明的启动类,即文件名和类名相同的那个类

(2)类的初始化顺序

1)如果这个类还没有被加载和链接,那先进行加载和链接   2)假如这个类存在直接父类,并且这个类还没有被初始化(注意:在一个类加载器中,类只能初始化一次),那就初始化直接的父类(不适用于接口)   3)加入类中存在初始化语句(如static变量和static块),那就依次执行这些初始化语句。   4)总的来说,初始化顺序依次是:(静态变量、静态初始化块)–>(变量、初始化块)–> 构造器;如果有父类,则顺序是:父类static方法 –> 子类static方法 –> 父类构造方法- -> 子类构造方法

4、类的加载

类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个这个类的java.lang.Class对象,用来封装类在方法区类的对象。

类的加载的最终产品是位于堆区中的Class对象。Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。加载类的方式有以下几种:   1)从本地系统直接加载   2)通过网络下载.class文件   3)从zip,jar等归档文件中加载.class文件   4)从专有数据库中提取.class文件   5)将Java源文件动态编译为.class文件(服务器)

5、加载器

JVM的类加载是通过ClassLoader及其子类来完成的,类的层次关系和加载顺序可以由下图来描述:

(1)加载器介绍

1)BootstrapClassLoader(启动类加载器)   负责加载$JAVA_HOME中jre/lib/rt.jar里所有的class,加载System.getProperty(“sun.boot.class.path”)所指定的路径或jar。 2)ExtensionClassLoader(标准扩展类加载器)   负责加载java平台中扩展功能的一些jar包,包括$JAVA_HOME中jre/lib/*.jar或-Djava.ext.dirs指定目录下的jar包。载System.getProperty(“java.ext.dirs”)所指定的路径或jar。3)AppClassLoader(系统类加载器)   负责记载classpath中指定的jar包及目录中class 4)CustomClassLoader(自定义加载器)   属于应用程序根据自身需要自定义的ClassLoader,如tomcat、jboss都会根据j2ee规范自行实现。

(2)类加载器的顺序

1)加载过程中会先检查类是否被已加载,检查顺序是自底向上,从Custom ClassLoader到BootStrap ClassLoader逐层检查,只要某个classloader已加载就视为已加载此类,保证此类只所有ClassLoader加载一次。而加载的顺序是自顶向下,也就是由上层来逐层尝试加载此类。 2)在加载类时,每个类加载器会将加载任务上交给其父,如果其父找不到,再由自己去加载。 3)Bootstrap Loader(启动类加载器)是最顶级的类加载器了,其父加载器为null。

java类加载器顺序_java中类的加载顺序介绍(ClassLoader)相关推荐

  1. java枚举加载顺序_java 中类的加载顺序(转)

    1.虚拟机在首次加载Java类时,会对静态初始化块.静态成员变量.静态方法进行一次初始化 2.只有在调用new方法时才会创建类的实例 3.类实例创建过程:按照父子继承关系进行初始化,首先执行父类的初始 ...

  2. 文件加载顺序_Java中类的加载顺序介绍(ClassLoader)

    Java中类的加载顺序介绍(ClassLoader) 1.ClassNotFoundExcetpion 我们在开发中,经常可以遇见java.lang.ClassNotFoundExcetpion这个异 ...

  3. java 类加载生命周期_Java类的加载与生命周期

    一.概要: 类的生命周期从类的 加载.连接.初始化 开始,到类的 卸载结束: 二.几个阶段: 加载:查找并加载类的二进制数据.(把类的.class文件的二进制数据读入内存,存放在运行时数据区的方法区: ...

  4. java类验证和装载顺序_java中类的加载顺序介绍(ClassLoader)

    转自:http://blog.csdn.net/eff666/article/details/52203406 1.ClassNotFoundExcetpion 我们在开发中,经常可以遇见java.l ...

  5. 什么是java的类加载器_JAVA-大白话探索JVM-类加载器(一)

    JVM??? Java语言的一个非常重要的特点就是与平台的无关性.而使用Java虚拟机是实现这一特点的关键.JVM是Java Virtual Machine(Java虚拟机)的缩写,Java程序编译后 ...

  6. java中类的加载顺序介绍(ClassLoader)

    1.ClassNotFoundExcetpion 我们在开发中,经常可以遇见java.lang.ClassNotFoundExcetpion这个异常,今天我就来总结一下这个问题.对于这个异常,它实质涉 ...

  7. java 类加载器 解密_JAVA类加载器总结整理

    一.What(是什么?) 1.概念 Java类加载器是Java运行时环境的一部分,负责动态加载Java类到JVM的内存空间中.每个Java类必须由某个类加载器装入到内存中.每一个类加载器都有一个父类加 ...

  8. java类加载器分类_Java类加载器特点的具体介绍

    Java类加载器一个我们经常使用的优秀语言,但是在我们使用的过程中有不少的问题需要我们解决.下面我们就详细的来看看相关问题的解决方法.想大家有所收获. Java类加载器的特性: 每个ClassLoad ...

  9. java中类的加载顺序

    java中类加载顺序: 1)静态代码块只执行一次:静态代码块首先被初始化 2)构造代码块在每次创建对象都会执行:构造函数都是最后执行的. 3)按照父子类继承关系进行初始化,先执行父类的初始化: 4)程 ...

最新文章

  1. JQuery Deferred 对象
  2. 基于新唐M0的XXTEA加密解密算法源码
  3. python之函数名称空间,作用域,嵌套函数
  4. keil 查看 stm32 io波形_如何系统地入门学习stm32?
  5. SpringBoot整合RabbitMQ测试
  6. VS2015 定时服务及控制端
  7. Weblogic调试延长时间
  8. 一个小白如何创建MYSQL数据表_MySQL小白扫盲(二)--建表、添加、查询
  9. C#LeetCode刷题之#485-最大连续1的个数(Max Consecutive Ones)
  10. Crackme017
  11. docker运行jenkins挂掉_docker搭建jenkins
  12. vue 原生js写车牌号键盘
  13. VSTO开发Powerpoint插件
  14. 线性代数学习笔记——第三十五讲——平面与平面的位置关系
  15. 多行文字cad提取数据_利用CAD自带的数据提取功能手动提取假表格至Excel
  16. zooKeeper篇-zk的选举机制
  17. HTML+CSS(part 1)
  18. 成立两只产业基金,微盟如何布局SaaS生态?
  19. 同步六进制加法计数电路设计(D触发器)
  20. 22 个鲜为人知的 CSS 高招让你技高一筹

热门文章

  1. Packet Tracer 7.3.0 win64网盘链接
  2. 一张图,教你用25种可视化工具如何完成
  3. 谁欠谁的幸福(高考满分作文)
  4. Kotlin实战(三)
  5. 在破公司上班的最后一天,老板让我给他开发一个拨号程序——初级版(Java实现)
  6. ROC将于10月8日上线PancakeSwap
  7. 【独立站运营】提高电子商务转化率的 7种方法
  8. 《中国人工智能学会通讯》——1.45 先做个普及,到底什么是虹膜识别
  9. JAVA延迟队列(实现数据的缓存和定时清理)
  10. Ubuntu下的Nginx-Uwsgi-Django项目部署详细流程