今天学习一下Java类的加载器的一些相关知识,我们的.java文件经过编译之后形成了.class文件,这个文件就是二进制的类的描述文件,jvm要想运行,就必须将.class文件加载到jvm的内存中,而这个加载.class的组件就是类的加载器。
1、类的加载过程,可以分为三个步骤如下:
第一步装载:查找并加载.class文件
第二步连接:连接也分三小步,就是验证.class的合法性,为类的静态变量分配内存,并将其初始化为默认值;然后就是解析把类中的符号引用转换为直接引用;
第三步:初始化,类的静态变量赋予正确的初始值;
准备阶段和初始化阶段看似有点牟盾,其实是不牟盾的,如果类中有语句:private static int a = 10,它的执行过程是这样的,首先字节码文件被加载到内存后,先进行链接的验证这一步骤,验证通过后准备阶段,给a分配内存,因为变量a是static的,所以此时a等于int类型的默认初始值0,即a=0,然后到解析(后面在说),到初始化这一步骤时,才把a的真正的值10赋给a,此时a=10。
2. 类的初始化
类什么时候才被初始化:
1)创建类的实例,也就是new一个对象
2)访问某个类或接口的静态变量,或者对该静态变量赋值
3)调用类的静态方法
4)反射(Class.forName("com.lyj.load"))
5)初始化一个类的子类(会首先初始化子类的父类)
6)JVM启动时标明的启动类,即文件名和类名相同的那个类
只有这6中情况才会导致类的类的初始化。
类的初始化步骤:
1)如果这个类还没有被加载和链接,那先进行加载和链接
2)假如这个类存在直接父类,并且这个类还没有被初始化(注意:在一个类加载器中,类只能初始化一次),那就初始化直接的父类(不适用于接口)
3)加入类中存在初始化语句(如static变量和static块),那就依次执行这些初始化语句。
3.类的加载
类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个这个类的java.lang.Class对象,用来封装类在方法区类的对象。看下面2图
类的加载的最终产品是位于堆区中的Class对象
Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口
加载类的方式有以下几种:
1)从本地系统直接加载
2)通过网络下载.class文件
3)从zip,jar等归档文件中加载.class文件
4)从专有数据库中提取.class文件
5)将Java源文件动态编译为.class文件(服务器)
JVM的类加载是通过ClassLoader及其子类来完成的,类的层次关系和加载顺序可以由下图来描述:
1)Bootstrap ClassLoader
负责加载$JAVA_HOME中jre/lib/rt.jar里所有的class,由C++实现,不是ClassLoader子类
2)Extension ClassLoader
负责加载java平台中扩展功能的一些jar包,包括$JAVA_HOME中jre/lib/*.jar或-Djava.ext.dirs指定目录下的jar包
3)App ClassLoader
负责记载classpath中指定的jar包及目录中class
4)Custom ClassLoader
属于应用程序根据自身需要自定义的ClassLoader,如tomcat、jboss都会根据j2ee规范自行实现ClassLoader
加载过程中会先检查类是否被已加载,检查顺序是自底向上,从Custom ClassLoader到BootStrap ClassLoader逐层检查,只要某个classloader已加载就视为已加载此类,保证此类只所有ClassLoader加载一次。而加载的顺序是自顶向下,也就是由上层来逐层尝试加载此类。
相关推荐
java类加载器学习三、类加载器的委托模式
java类加载器学习二、自定义类加载器
Java类加载器是Java运行时环境(JRE)的一个重要组成部分,它负责将Java字节码加载到内存中,使其可以被Java虚拟机(JVM)执行。类加载器本身也是一个类,它的主要职责是从文件系统、网络或者JAR包中加载类文件到JVM...
Java 类加载器是Java虚拟机(JVM)的重要组成部分,它负责将类的.class文件从文件系统或网络中加载到内存中,并将其转换为运行时的类对象。类加载器的这种动态加载机制为Java提供了极高的灵活性,使得程序可以在运行...
类装载器学习一、类加载器的基本概念 类装载器学习一、类加载器的基本概念 类装载器学习一、类加载器的基本概念
Java中的类加载器是JVM(Java虚拟机)的核心组件之一,它们负责将.java源代码编译成的.class字节码文件加载到JVM中,从而使得程序能够运行。类加载器不仅涉及到程序的正常执行,还与Java的动态加载、模块化系统以及...
关于Java类加载器的探讨 Java类加载器是Java技术系统中核心的部分,它们之间存在继承关系。引导类加载器负责加载jdk中的系统类,扩展类加载器负责加载标准...因此,学习和理解Java类加载器对Java开发人员非常重要。
理解类加载器的工作原理对于深入学习Java编程至关重要。在Java中,类加载器按照层次结构进行组织,包括引导类加载器、扩展类加载器和应用程序类加载器,每个都有特定的职责。 1. **引导类加载器(Bootstrap ...
Java类加载器是Java虚拟机(JVM)的重要组成部分,它的主要职责是将类的字节码文件(.class文件)从文件系统、网络或内存中读取,并转换为运行时的java.lang.Class对象。这个过程是Java动态加载机制的核心,使得Java...
Java类加载器采用了**双亲委派模型(Parent Delegation Model)**,这意味着当一个类加载器收到加载类的请求时,它首先会委托其父类加载器去尝试加载,只有当父类加载器无法加载时,当前类加载器才会尝试自己加载。...
本文主要解析Java类加载的原理,分为三个部分:基础的类加载原理解析、插件环境下的类加载和线程上下文类加载器。 首先,Java虚拟机(JVM)内置了三种预定义的类加载器: 1. 启动(Bootstrap)类加载器:这是最基础的...
线程上下文类加载器(Thread Context ClassLoader)是Java提供的一种机制,允许线程在运行时指定一个类加载器,确保类由同一个类加载器加载。这对于应用程序服务器和插件系统尤其有用,因为它允许组件使用自己的类...
在Java编程中,类加载器(Class Loader)扮演着至关重要的角色,它负责查找并加载Java类到JVM内存中。本部分我们将深入探讨JVM中的类加载器,特别是根类加载器、扩展类加载器和系统类加载器。 首先,让我们了解类...
理解类加载器的工作原理对于深入学习Java平台、优化应用程序性能以及实现自定义加载器至关重要。 1. **类加载器层次结构** Java中的类加载器分为三个主要层次:启动类加载器(Bootstrap ClassLoader)、扩展类加载...
* 学习如何将自定义类加载器集成到Java应用中。 * 修改类加载器以适应Java 2版本。 为了更好地理解本教程,你需要具备以下基础: * 基本的Java编程能力,包括能够创建、编译和执行简单的命令行Java程序。 * 对类...
Java的类加载机制遵循双亲委派模型,即当一个类加载器接收到加载类的请求时,它会首先将这个任务委托给父类加载器,只有当父类加载器无法找到对应的类时,才会尝试自己去加载。这种设计有助于保持类的唯一性和避免...
本文将主要围绕“黑马程序员------类加载器学习注意点”展开,探讨一些关键知识点。 首先,我们需要理解类加载器的基本工作原理。在Java中,类加载过程包括加载(Loading)、验证(Verification)、准备...