首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

java类的加载过程和类加载器的分析

记得第一次遇见这个问题的时候,同学给我的回答是: 1.虚拟机会加载JDK里类的核心包 2.虚拟机会加载JDK里类的扩展包 3.虚拟机会加载JDK里类的系统包 4.虚拟机再会加载我们写好的java类。...希望大家看了之后更能理解JVM的工作原理和java类的生产过程(类加载的过程); 类从被加载到虚拟机类存中开始,到被卸载出内存为止,它的整个生命周期包括 加载 → 验证 → 准备 → 解析 → 初始化 ...这就是我们常说的,静态变量/方法 在类加载的时候就执行了,通过类名.静态**来调用)分配内存并设置类的初始值;   值得一提的是 如果有以下语句:  public static int i =...123 ; 在准备阶段的初始值是 0 ,而不是 123 , 是因为此时 只是分配内存空间而已, 并没有对 i 进行初始化, 真正的对 i 赋值是在 初始化 阶段; 4.解析 1.类或接口的解析;...在准备阶段,已经为变量赋过一次系统要求的初始值,到了初始化阶段会根据程序员的要求出初始化变量赋值。

60350

java类的加载过程和类加载器的分析

记得第一次遇见这个问题的时候,同学给我的回答是: 1.虚拟机会加载JDK里类的核心包 2.虚拟机会加载JDK里类的扩展包 3.虚拟机会加载JDK里类的系统包 4.虚拟机再会加载我们写好的java类。...希望大家看了之后更能理解JVM的工作原理和java类的生产过程(类加载的过程); 类从被加载到虚拟机类存中开始,到被卸载出内存为止,它的整个生命周期包括 加载 → 验证 → 准备 → 解析 → 初始化 ...,静态变量/方法 在类加载的时候就执行了,通过类名.静态**来调用)分配内存并设置类的初始值;   值得一提的是 如果有以下语句:  public static int i = 123 ;...在准备阶段的初始值是 0 ,而不是 123 , 是因为此时 只是分配内存空间而已, 并没有对 i 进行初始化, 真正的对 i 赋值是在 初始化 阶段; 4.解析 1.类或接口的解析; 2.字段解析;...在准备阶段,已经为变量赋过一次系统要求的初始值,到了初始化阶段会根据程序员的要求出初始化变量赋值。

1.5K80
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    JVM 类加载机制_类加载机制的作用和过程

    (类的五个加载过程) 二、类的加载时机 1.类的生命周期 类从被加载到虚拟机内存中开始,到卸载出内存为止,整个生命周期包括加载、验证、准备、解析、初始化、使用和卸载。...3.类的初始化时机 首先我们得明确一下初始化和实例化的区别: 类的实例化是指创建一个类的实例(对象)的过程; 类的初始化是指为类中各个类成员(被static修饰的成员变量)赋初始值的过程,是类生命周期中的一个阶段...3.准备 准备阶段是正式为类被static修饰的变量(不包含实例变量)分配内存并设置类变量初始值的阶段。...类的实际地址了,于是就将“People”符号换成People这个类的实际内存地址。...实际上,初始化阶段就是执行类构造器()方法的过程。 四、初始化时的类构造器 我们在类加载的验证和初始化时都提到过类构造器 (),这里稍微介绍一下。

    54720

    Java中的类加载器是什么,提供一个自定义类加载器的实际案例

    它是实现Java语言特性如动态加载、热加载等的基础,对于理解Java程序的运行机制和实现一些高级特性非常重要。下面我将谈谈自己对Java类加载器的理解,并提供一个自定义类加载器的实际案例。...2、链接:在加载阶段之后,进行验证、准备和解析等工作,为类变量分配内存和设置初始值等操作。 3、初始化:对类进行初始化,包括执行静态变量赋值和静态代码块等操作。...自定义类加载器的实际案例 下面我将介绍一个简单的自定义类加载器的实际案例,通过这个案例可以更好地理解类加载器的工作原理和自定义类加载器的使用方法。...在main方法中,我们可以使用自定义类加载器加载指定路径下的类,并实例化和调用这些类的方法。通过这个案例,我们可以看到自定义类加载器的使用方法和实际应用场景。...自定义类加载器的实际应用场景包括动态加载模块、实现类热加载、加载加密的类文件等。通过自定义类加载器,我们可以更灵活地控制类的加载过程,实现一些特殊的需求和功能。

    19410

    深度分析:Java类加载机制和类加载器

    类加载机制 所谓类加载机制就是JVM虚拟机把Class文件加载到内存,并对数据进行校验,转换解析和初始化,形成虚拟机可以直接使用的Jav类型,即Java.lang.Class。 2....这里还需要注意以下几点 对基本数据类型来说,对于类变量(static)和全局变量,如果不显式地对其赋值而直接使用,则系统会为其赋予默认的零值,而对于局部变量来说,在使用前必须显式地为其赋值,否则编译时不通过...如果在一个类的clinit方法中有耗时很长的操作,那就可能造成多个线程阻塞,在实际应用中这种阻塞往往是很隐蔽的。 说到 clinit方法,就不得不说一下对象实例化方法init。...在Java中,一个类用其全限定类名(包括包名和类名)作为标识;但在JVM中,一个类用其全限定类名和其类加载器作为其唯一标识。...这意味着两个类加载器加载的同名类:(Person.pg.kl)和(Person.pg.kl2)是不同的、它们所加载的类也是完全不同、互不兼容的。

    69120

    jvm之java类加载机制和类加载器(ClassLoader)的详解

    设置static修饰的变量初始值。 ⑤ 解析 类,接口,字段,类方法等解析。用的时候就可以用的到。 ⑥ 初始化 为静态变量赋值,执行静态代码块。 ⑦ 使用 创建实例对象。...(先有个C才有的JAVA,底层还是通过C和C++来实现的),核心的重点是谁都不能少,少了无法存活。...用户应用程序class-path 或者java命令运行时参数 -cp(开发人员写的代码,对应类存放在哪里,JAVA是怎么知道的,为什么用eclipse和idea右键可以直接跑了,其实就是在底层指定目录地址...,输出类加载和卸载的日志信息。...,则下面的热更新会失效,因为双亲委派机制,HelloWorld实际上是被这个类加载器加载的; URLClassLoader parentLoader = new URLClassLoader

    1.6K20

    jvm之java类加载机制和类加载器(ClassLoader)的详解

    该引用是和内存中的布局有关的,并且一定加载进来的。...3.初始化 初始化是为类的静态变量赋予正确的初始值,准备阶段和初始化阶段看似有点矛盾,其实是不矛盾的,如果类中有语句:private static int a = 10,它的执行过程是这样的,首先字节码文件被加载到内存后...(会首先初始化子类的父类) JVM启动时标明的启动类,即文件名和类名相同的那个类 除此之外,下面几种情形需要特别指出: 对于一个final类型的静态变量,如果该变量的值在编译时就可以确定下来,那么这个变量相当于...正如一个对象有一个唯一的标识一样,一个载入JVM的类也有一个唯一的标识。在Java中,一个类用其全限定类名(包括包名和类名)作为标识;但在JVM中,一个类用其全限定类名和其类加载器作为其唯一标识。...这意味着两个类加载器加载的同名类:(Person.pg.kl)和(Person.pg.kl2)是不同的、它们所加载的类也是完全不同、互不兼容的。

    91620

    【JVM进阶之路】十四:类加载器和类加载机制

    1、类与类加载器 类加载器只用于实现类的加载动作。 但对于任意一个类,都必须由加载它的类加载器和这个类本身一起共同确立其在Java虚拟机中的唯一性,每 一个类加载器,都拥有一个独立的类名称空间。 ?...loadClass(String name) throws ClassNotFoundException { try { //获取文件名...Java虚拟机能够识别的(按照文件名识别,如rt.jar、tools.jar,名字不符合的类库即使放在lib目录中也不会被加载)类。...双亲委派模型的工作过程:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到最顶层的启动类加载器中...由于双亲委派模型在JDK 1.2之后才被引入,但是类加载器的概念和抽象类 java.lang.ClassLoader则在Java的第一个版本中就已经存在,为了向下兼容旧代码,所以无法以技术手段避免loadClass

    36820

    ClassLoader和类加载机制

    02 类加载与类加载器 类加载: 类加载的过程就是将Class文件中描述的各种信息加载到虚拟机中,供程序后期运行和使用的。...3、准备 为变量分配内存,设置类变量的初始值。 4、解析 将常量池中的符号应用替代为直接引用。...5、初始化 是类加载生命周期的最后一个过程,执行类中定义的java程序代码 类加载器: 在前面的类加载过程中,大部分动作都是完全由虚拟机主导和控制的。...类加载器和这个类本身确定了其在java虚拟机中的唯一性,每一个类加载器都有一个独立的类命名空间,也就意味着,如果比较两个类是否相等,只有在这两个类是由同一个类加载器加载的前提下才有意义,否则,即使这两个类来源于同一个...和Extention Class Loader加载,在实际应用中,可以是网络中传递过来的加密字节流,抑或着是实现脚本的热部署操作。

    1.3K60

    类和对象的加载过程原理

    类加载的结论和代码演示 顺序: 父类静态属性 (可以是对象) 和静态代码块,看其在类中的先后顺序 子类静态属性和静态代码块 ,看其在类中的先后顺序 父类非静态属性和非静态代码块 ,看其在类中的先后顺序...然后在继续加载 Root 类的静态代码块 (静态的安装在类中的先后顺序加载),输出第四行 然后加载 Root 的子类 Sub,静态属性和代码块随着类的加载而加载 由于只有一个静态代码块,所以就只加载一个...,输出第五行 然后是 new 对象,所以再回到父类中加载非静态的属性、代码块(属性和代码块按照再类中写的先后顺序加载),最后再加载父类的构造方法。 ​...回单 Main 方法中继续执行 System.out.println(); 复制代码 换行之后,我们又 new 了一个对象,这个时候重复 3 和 4 过程就行,因为类只需要加载一次,静态属性和代码块是随类的加载而加载的...重点: 这个时候会认为 Root 类已经加载到内存中去了(实际还在加载的过程中,还没加载完),认为已经加载过一次类了,所以会把这次当作第二次 new 对象,所以会去加载非静态的代码块,非静态属性,最后加载构造方法

    33710

    OSGi的类加载器架构和特性,对比其他类加载器的优势

    以下是OSGi的类加载器架构和特性:模块化构建: OSGi允许将应用程序划分为多个独立的模块,每个模块都有自己的类和资源。这种模块化的构建方式可以将应用程序划分为更小的可维护和可重用的部分。...类加载器层次结构: OSGi引入了类加载器层次结构,包括了系统类加载器、扩展类加载器和模块类加载器。每个模块都有自己独立的类加载器,它只加载属于模块的类和资源,并且可以隔离不同模块之间的类和资源。...模块隔离性: OSGi的类加载器架构提供了模块之间的隔离性。每个模块都有自己独立的类加载器,它只加载属于模块的类和资源。这种隔离性可以防止模块之间的类冲突和版本冲突。...OSGi类加载器相比其他类加载器的优势模块化架构: OSGi的类加载器架构是为模块化设计的,使得应用程序可以按需加载和管理模块。与传统的类加载器相比,它更适合构建大型和复杂的应用程序。...模块隔离性: OSGi的类加载器架构提供了模块之间的隔离性。每个模块有自己独立的类加载器,它只加载属于模块的类和资源。这种隔离性可以防止模块之间的类冲突和版本冲突,提高了应用程序的稳定性和可靠性。

    42261

    类的加载

    概念 类加载 加载:将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区的运行时数据结构,然后生成一个代表这个类的java.lang.Class对象 链接:将Java类的二进制代码合并到...JVM的运行状态之中的过程 验证:确保加载的类信息符合JVM规范,没有安全方面的问题 准备:正式为类变量(static)分配内存并设置类变量默认初始化值的阶段,这些内存都将在方法区中进行分配 解析:虚拟机常量池的符号引用...(类构造器是构造类的信息的,不是构造该类对象的构造器) 当初始化一个类的时候,如果发现其父类还没有初始化,则需要先触发其父类的初始化 虚拟机会保证一个类的()方法在多线程环境中被正确加锁和同步 什么时候会发生类的初始化...比如:当通过子类引用父类的静态变量,不会导致子类初始化 通过数组定义类引用,不会触发此类的初始化 引用常量不会触动此类的初始化(常量在链接阶段就存入调用类的常量池中了) 类加载的作用 将class文件字节码内容加载到内存中...类缓存 标准的JavaSE类加载起器可以按要求查找类,但一旦某个类被加载到类加载器中,它将维持加载(缓存)一段时间。

    28810

    【Android 逆向】类加载器 ClassLoader ( 启动类加载器 | 扩展类加载器 | 应用类加载器 | 类加载的双亲委托机制 )

    C/C++ 实现 , 加载 Java 的核心类库 , 如 java.lang 包下的系统类 ; Java 中无法和获取 ; Extention ClassLoader : 扩展类加载器 , 加载 /lib..., Extention ClassLoader 加载额外的 /lib/ext 类库 , Application ClassLoader 加载开发者自己开发的类库 ; 加载完 开发者 开发的类库 后 ,...类加载任务 之后 , 也会 委托 父类的父类 类加载器 执行 ; 委托操作 , 会一直传递到 最顶层的 启动类加载器 Bootstrap ClassLoader ; 如果 启动类加载器 Bootstrap...; 同理 , 父类 委托 给子类的 类加载任务 , 如果 子类类加载器 可以完成加载 , 成功返回 , 如果子类类加载器无法完成加载 , 就再次 将 类加载任务 委托给 子类的子类 , 继续向下传递 ;...无法 被替代 , 系统类只能由 启动类加载器 Bootstrap ClassLoader 加载 , 应用类加载器 加载被篡改的 Java 核心类是无效的 ;

    89230

    类加载器 超详解:什么是类加载器,类加载器作用及应用场景,类加载时机,类加载的完整过程,类加载器分类

    3.3 准备负责为类的类变量(被static修饰的变量)分配内存,并设置默认初始化值(初始化静态变量)static变量,分配空间在准备阶段完成(设置默认值),赋值在初始化阶段完成static变量是final...2)类加载的执行过程: 加载、验证、准备、解析、初始化、使用、卸载加载:查找和导入class文件验证:保证加载类的准确性准备:为类变量分配内存并设置类变量初始值解析:把类中的符号引用转换为直接引用初始化...不推荐,尽可能不要去更改JDK安装目录中的内容,因为即使放进去由于文件名不匹配的问题也不会正常地被加载(在加载jar包的时候,会对名称进行校验,名称必须符合JVM内部的一些规范)。使用参数进行扩展。...,说明自己拓展的Jar包被加载了应用场景:在企业中开发一些偏底层的基础类,所有用到jdk的项目都需要使用这些基础类,此时就通过启动类加载器去加载用户jar包4.2.2 扩展类加载器和应用程序类加载器扩展类加载器和应用程序类加载器都是...:Arthas中类加载器相关功能类加载器的加载路径可以通过classloader –c hash值查看:查看应用程序类加载器所加载的jar包4.3 JDK9之后的类加载器由于JDK9引入了module的概念

    11910

    java类加载的过程 父_类加载机制原理

    当类被加载后就进入连接阶段,这一阶段包括验证、准备(为静态变量分配内存并设置默认的初始值)和解析(将符号引用替换为直接引用)三个步骤。...当Java程序需要使用某个类时,如果该类还未被加载到内存中,Java虚拟机会通过加载、连接和初始化一个Java类, 使该类可以被正在运行的Java程序所使用。...类初始化的时机 在类和接口被加载和连接的时机上, Java虚拟机规范给实现提供了一定的灵活性 。但是它严格地定义了初始化的时机 。所有的Java虚拟机实现必须在每个类或接口首次主动使用时初始化 。...如果在一个类的()方法中有耗时很长的操作, 那就可能造成多个进程阻塞, 在实际应用中这种阻塞往往是隐蔽的。...类的初始化阶段主要是对类变量进行初始化,在Java类中对类变量指定初始值有两种方式: 声明类变量时指定初始值 使用静态初始化块为类变量指定初始值 JVM初始化一个类一般包括如下几个步骤: 假如这个类还没有被加载和连接

    71520

    测试用例等价类和边界值_等价类划分和边界值的区别与联系

    穷举测试是最全面的测试,但是在实际工作中不能采用,因为测试效率太低(数据量巨大,根本测不过来)     理想的测试思想:使用最少的测试数据,达到最好的测试质量(最高性价比)       因为毕竟没有做穷举测试...边界值法往往跟等价类划分法一起使用,从而形成一套较为完善的测试方案。     个别情况下,等价类和边界值也不需要一起用。...边界值点:有效等价类和无效等价类之间的分界点。(最大值、最小值)     次边界值点:边界值左右两边相邻的点是次边界值点。...优先测试最大值和最小值     需求文档中是否边界值都是需求明确的?       ...    步骤1:分析需求,分别将姓名和年龄控件的等价类和边界值进行分析,填入《数据分析表》 步骤2:根据数据分析结果,形成测试方案,编写测试用例。

    1.5K20

    java的类加载

    类加载机制 JVM类加载机制分为五个部分: 加载,验证,准备,解析,初始化 加载 加载是类加载过程中的一个阶段,会在内存中生成一个代表这个类的java.lang.Class 对象,作为方法区这个类的各种数据的入口...,并且不会危害虚拟机自身 准备 准备阶段是正式为类变量分配内存并设置类变量的初始值阶段,在方法区分配这些变量所使用的内存空间 例如: public static int v = 666; 此时会先给v...) 负责加载 JAVA_HOME\lib 目录中的,或通过-Xbootclasspath 参数指定路径中的,且被 虚拟机认可(按文件名识别,如 rt.jar)的类。...实现自定义的类加载器 当一个类收到了类加载请求,它首先不会尝试自己去加载这个类,而是把这个请求委派给父类去完成 没一个层次的类加载器都是如此,因此所有的加载请求都会传送到启动类加载器中 只有当父类加载器反馈自己无法完成这个请求的时候...在正常情况下,根据双亲委派机制,将加载编译目录中的MathServiceImpl,为正确的写法,现在我们需要实现一个ClassLoader类,重写findClass和loadClass方法: package

    85520

    类的加载时机

    上文:对象的内存是如何布局的? ---- ? 类的加载主要有三步:加载->连接->初始化。连接过程又分为 验证->准备->解析。 ?...类是通过.java---complier----.class---classloader--Class,然而这个加载又分为以上的7大步骤,那什么时候类开始加载?什么条件必须会加载?...; } public static final String HELLOWORLD = "hello world"; } 结果: hello world 接口类的加载 接口类加载与类大致相同...,区别如下: 接口不要求父类全部初始化完毕; 接口不能使用static{}代码块; 最后 类的加载时机分为7个阶段,每个阶段都有详细的工作,当然除了加载和卸载其它阶段可能存在并行,而非顺序执行。...这里只是简要介绍加载的相关引用问题,关于类加载器,再详细深入。

    30720
    领券