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。
相关推荐
通过配置类路径,开发者可以自定义加载顺序和加载来源,例如从网络、文件系统或特定的jar中加载类。 **配置灵活性**: 在开发大型Java应用时,类加载器的配置灵活性变得非常重要。例如,可以创建自定义类加载器来...
在Tomcat中,我们可以通过配置`catalina.properties`文件和`server.xml`文件来调整类加载策略,例如设置自定义的类加载顺序或启用共享类加载器。 此外,Tomcat还支持热部署,即在不重启服务器的情况下更新Web应用的...
- 对于`javax.*`, `org.xml.sax.*`, `org.w3c.dom.*`, `org.apache.xerces.*`, `org.apache.xalan.*`等包下的类,它们不受上述加载顺序的影响,即所有这些类都由Bootstrap ClassLoader加载。 3. **META-INF/...
在Java编程语言中,ClassLoader是核心组件之一,它负责加载类到JVM(Java虚拟机)中。理解ClassLoader的工作机制以及类变量初始化的顺序对于深入理解Java运行时环境至关重要。这篇博文将探讨这两个主题。 首先,让...
了解Java中继承关系的加载顺序对于理解和优化程序性能至关重要。以下是对这个主题的详细阐述: 1. 类加载机制 Java的类加载过程分为三个主要阶段:加载、验证、准备、解析和初始化。当一个类被首次引用时(例如...
开发者可以通过`-Xbootclasspath`、`-Xbootclasspath/p`和`-Xbootclasspath/a`命令行参数来指定引导类加载器的类路径,从而影响加载顺序或添加额外的类库。 在特殊情况下,如上述示例中的`java -Xbootclasspath/a:...
类加载器的作用不仅仅是加载类,还包括确保类的唯一性,避免重复加载,并且遵循特定的加载顺序。以下是对类加载器原理的详细解释: 1. 类加载器作用: 当JVM启动时,如果需要使用某个类,对应的类加载器会将这个类...
下面我们将详细介绍 Java 中类的加载顺序执行结果的相关知识点。 类的加载 在 Java 语言中,类的加载是指将类加载到内存中的过程。在 Java 中,类的加载是通过类加载器(ClassLoader)来实现的。类加载器负责将类...
本文探讨了Java虚拟机(JVM)中的一个重要特性:动态类加载(Dynamic Class Loading)。这一机制为Java平台提供了强大的能力,允许在运行时安装软件组件,例如从网络下载Applet并加载到Web浏览器中。尽管其他系统也...
例如,可能会创建自定义的ClassLoader子类,然后尝试加载一个类,观察加载顺序和结果。这些测试用例可以帮助我们理解: - 如何使用`java.lang.ClassLoader`的`loadClass()`方法。 - 双亲委派模型的工作流程。 - ...
Java 类加载器(ClassLoader)是Java虚拟机(JVM)中的一个重要组成部分,它负责加载类的字节码文件,使得程序能够运行。深入理解ClassLoader对于优化应用性能、处理类加载问题以及实现自定义加载策略至关重要。 一...
这是因为Tomcat默认会按照上述顺序查找类,当多个目录下存在相同或相似的类时,加载顺序决定了最终加载哪个版本的类。因此,合理配置类路径,确保正确的加载顺序,是防止此类问题的关键。 #### 结论 Tomcat的类...
这样可以避免类加载的混乱,确保类和资源的正确加载顺序。 ### 结语 掌握Java类加载器的工作原理和使用技巧对于任何Java开发者来说都至关重要。通过自定义类加载器,开发者不仅能够扩展JVM的功能,还能够优化应用...
java ClassLoader的学习 java是一门解释执行的语言,由开发人员编写好的java源文件先编译成字节码文件.class... 一个类如果要被JVM所调度执行,必须先把这个类加载到JVM内存里,java.lang下有个很重要的类ClassL
在Java编程语言中,类加载器(ClassLoader)是运行时环境的重要组成部分,它负责将类的字节码从各种来源(如硬盘、网络或内存)加载到Java虚拟机(JVM)中,使得程序能够执行。类加载工具则是辅助开发者理解和分析类...
4. **处理资源**:自定义ClassLoader还需要处理类的加载顺序、缓存策略等问题。 #### 六、实战案例分析 以淘宝网为例,淘宝作为一个大型电子商务平台,面临着频繁的代码更新和部署。为了提高系统的灵活性和可用性...
例如,假设有一个名为A的类,加载顺序如下: 1. 如果WebApp ClassLoader的缓存中没有类A,则会查找System ClassPath,未找到A。 2. 接下来查找Application Class Path,如果在其中找到了A(如在wsdl4j.jar中),则...
Java类的执行顺序是编程过程中一个非常重要的概念,特别是在深入理解和优化代码性能时。本文将详细探讨Java类的加载、初始化、执行等步骤,并通过实例分析阿里面试中可能涉及的相关问题,结合流程图帮助理解这一过程...
类加载机制涉及类加载顺序、类加载器的体系结构、类加载过程以及双亲委派模型等核心概念。架构师或高级开发人员必须深刻理解这些知识点,以便在进行大型互联网平台架构设计和开发时做出正确的决策。 首先,类加载指...