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

Java类加载-加载

这就是虚拟机的类加载。 类加载概念 ? 上图是类加载和卸载的整个过程示意图,其中验证、准备、解析统称为连接阶段。...类加载-加载阶段 加载是类加载的第一个阶段,加载阶段的主要目标是: 通过一个类的全限定名来获取定义此类的二进制字节流 将字节流的静态信息结构转换为方法区(元数据区)的运行时数据结构 在内存中生成一个代表这个类的...非数组类的加载需要通过类加载器实现,既可以使用系统的提供的引导类加载,也可以使用用户自定义的类加载器去完成,关于类加载器后续我会单独写一篇文章来介绍,并且实现我们自己的一个类加载器。...对于数组类来说,数组类是由Java虚拟机直接创建的,但是数组中的元素类型需要通过类加载器加载。数组类的可见性与数组中元素的可见性一致,如果元素不是引用类型,数组类的可见性将默认为public。...本期类加载的加载阶段就介绍到这,下期我们会讲解类加载的连接阶段,我们下期再见!!!

1.3K40

类加载

类加载器并不需要等到某个类被"首次主动使用"时再加载它,JVM规范规定JVM可以预测加载某一个类,如果这个类出错,但是应用程序没有调用这个类, JVM也不会报错;如果调用这个类的话,JVM才会报错,(LinkAgeError...加载机制 全盘负责,当一个类加载器负责加载某个Class时,该Class所依赖的和引用的其他Class也将由该类加载器负责载入,除非显示使用另外一个类加载器来载入 双亲委托,先让父类加载器试图加载该类,...,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有当父类加载器反馈自己无法完成加载请求(它管理的范围之中没有这个类)时,子加载器才会尝试着自己去加载 ?...当AppClassLoader加载一个class时,它首先不会自己去尝试加载这个类,而是把类加载请求委派给父类加载器ExtClassLoader去完成。...自定义加载器 既然JVM已经提供了默认的类加载器,为什么还要定义自已的类加载器呢?

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

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

    文章目录 一、类加载器 二、类加载的双亲委托机制 一、类加载器 ---- Java 虚拟机 ClassLoader 类加载器 : Bootstrap ClassLoader : 启动类加载器 , 该 加载器由...C/C++ 实现 , 加载 Java 的核心类库 , 如 java.lang 包下的系统类 ; Java 中无法和获取 ; Extention ClassLoader : 扩展类加载器 , 加载 /lib...; 类加载的双亲委托机制 : 类加载器 ClassLoader 接收到 类加载任务 之后 , 自己不会先进行加载 , 反而将该 类加载任务 委托 给 父类类加载器 执行 ; 父类类加载器 接收 到 该...ClassLoader 完成了 类加载 操作 , 返回加载的类 ; 如果 启动类加载器 Bootstrap ClassLoader 无法完成 类加载 操作 , 就会 将 类加载任务 委托给 子类完成...; 同理 , 父类 委托 给子类的 类加载任务 , 如果 子类类加载器 可以完成加载 , 成功返回 , 如果子类类加载器无法完成加载 , 就再次 将 类加载任务 委托给 子类的子类 , 继续向下传递 ;

    89130

    类加载

    当类也就是class文件被加载到虚拟机内存开始,到卸载出内存为止。它将要执行以下7个步骤: 加载 验证 准备 解析 初始化 使用 卸载 ? 下面我们看一下每一个阶段的详细流程。...加载 加载也就是把class文件加载到虚拟机内存中。在加载时虚拟机需要完成3个方面的工作: 通过一个类的全限定名来获取类的二进制字节流。 将字节流所代表的静态存储结构转化为方法区中的运行时数据结构。...在内存中生成一个代表这个类的java.lang.Class对象。...字节码验证:这个阶段是最复杂的也是最耗时的验证,它主要目的是对类的方法体进行验证,校验类中的方法在运行时,不会做出威胁虚拟机的安全事件。...在解析时主要分为下面的几种: 类或接口的解析 字段解析 类方法解析 接口方法解析 初始化 初始化阶段主要的目的是为静态变量或者静态代码块执行赋值的操作。

    49730

    类加载

    类加载器种类 启动类加载器,Bootstrap ClassLoader,加载JACA_HOME\lib,或者被-Xbootclasspath参数限定的类 扩展类加载器,Extension ClassLoader...,加载\lib\ext,或者被java.ext.dirs系统变量指定的类 应用程序类加载器,Application ClassLoader,加载ClassPath中的类库 自定义类加载器,通过继承ClassLoader...实现,一般是加载我们的自定义类 双亲委派模型 类加载器 Java 类如同其它的 Java 类一样,也是要由类加载器来加载的;除了启动类加载器,每个类都有其父类加载器(父子关系由组合(不是继承)来实现);...所谓双亲委派是指每次收到类加载请求时,先将请求委派给父类加载器完成(所有加载请求最终会委派到顶层的Bootstrap ClassLoader加载器中),如果父类加载器无法完成这个加载(该加载器的搜索范围中没有找到对应的类...双亲委派好处 避免同一个类被多次加载; 每个加载器只能加载自己范围内的类; 类加载过程 类加载分为三个步骤:加载,连接,初始化; ?

    48500

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

    4.2 JDK8及之前的版本首先来看JDK8及之前的版本,JDK8及之前的版本中默认的类加载器有如下几种:启动类加载器(Bootstrap ClassLoader、C++实现):加载JAVA_HOME/...它是JVM的一部分,负责加载Java核心类库,如java.lang包中的类。它是最顶层的类加载器,通常使用C++实现,无法在Java代码中直接获取到。...)是由Hotspot虚拟机提供的、使用C++编写的类加载器,Java程序员无法修改或者扩展源代码,所以只关注这个加载器的作用。...这是因为启动类加载器在JDK8中是由C++语言来编写的,在Java代码中去获取既不适合也不安全,所以才返回null(String类确实是由启动类加载器加载的,但是启动类加载器由虚拟机底层实现、没有存在Java...推荐,使用-Djava.ext.dirs=jar包目录进行扩展,这种方式会覆盖掉原始目录(jre-xx/lib/ext),可以追加上原始目录,并使用 ;(windows系统所用符号) :(macos/linux

    11810

    类加载器与类的加载过程

    类加载器子系统作用 类加载器子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识。...加载的类信息存放于一块称为方法区的内存空间。...除了类的信息外,方法区中还会存放运行时常量池信息,可能还包括字符串字面量和数字常量(这部分常量信息是Class文件中常量池部分的内存映射) 类加载器ClasLoader角色 class file存在于本地硬盘上...类的加载过程 public class HelloLoader { public static void main(String[] args) { System.out.println...由于Java采用的是懒加载策略,只有当我们需要用到这个类的时候才会去加载他  初始化阶段就是执行类构造器方法()的过程。

    18230

    类加载与 Java主类加载机制解析

    之所以要逐个详细讲解,一方面是因为JVM使用C/C++编写而成,而C/C++语言本身就比Java语言更具难度,相信只要不是直接从事JVM开发的道友,阅读起来都会比较吃力,里面有太多的内存分配、回收、指针...以上便是一个Java类加载的核心流程。了解了类加载的核心流程之后,也许聪明的你会忍不住想,Java类的加载到底何时才会被触发呢?...Java程序主类的类加载器默认是系统加载器,该加载器是JDK类库中定义的sun.misc.AppClassLoader,关于该加载器的细节会在后文详述。JVM体系中加载器的继承关系如下图所示。 ?...这里不得不提一句,JVM作为一款虚拟机,其本身由C/C++语言写成,但是JVM是为执行Java字节码文件而生的,因此JVM内部必然有一套机制能够从C/C++程序调用Java类中的方法,这套机制便通过JavaCalls...AppClassLoader的父加载器是ExtClassLoader,这是扩展类加载器,用于加载JDK中指定路径下的扩展类,这种加载器不会加载Java应用程序的主类,所以程序流会进入if(this.parent

    94010

    类加载机制

    类加载器并不需要等到某个类被“首次主动使用”时再加载它,JVM 规范允许类加载器在预料某个类将要被使用时就预先加载它,如果在预先加载的过程中遇到了 .class 文件缺失或存在错误,类加载器必须在程序首次主动使用该类时才报告错误.../md/java/jvm/java-jvm-classload.html 2 类加载机制 2.1 双亲委派机制 双亲委派机制是指如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把请求委托给父加载器去完成...,依次向上,因此,所有的类加载请求最终都应该被传递到顶层的启动类加载器中,只有当父加载器 在它的搜索范围中没有找到所需的类时,即无法完成该加载,子加载器才会尝试自己去加载该类。...既然是加载这个类时出现的问题,我们首先要知道是哪个类加载器在尝试加载这个类。...结合类加载机制中的全盘负责机制,我们知道这个匿名类是由加载依赖它的 org.apache.iotdb.MySum 的类加载器来加载的,我们把这个类加载器记为 A。

    50610

    类加载机制

    类加载器只用于实现类的加载动作。对于任意一个类,都需要由加载它的类加载器和这个类本身一同确立其在Java虚拟机中的唯一性,每一个类加载器,都拥有一个独立的类名称空间。...从开发人员的角度类加载器有三种:启动类的加载器,扩展加载器,应用程序类加载器 启动类加载器:负责将存放在<JAVA_HOME>\lib目录中的类库加载到虚拟机内存中 扩展加载器:负责将存放在<JAVA_HOME...>\lib\ext目录中的类库加载到虚拟机内存中 应用程序类加载器:它负责加载用户类路径(ClassPath)上所指定的类库 双亲委派机制 类加载器之间如下图的这种层次关系,称为类加载器的双亲委派模型。...双亲委派模型的工作过程:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中...例如类java.lang.Object,它存放在rt.jar之中,无论哪一个类加载器要加载这个类,最终都是委派给处于模型最顶端的启动类加载器进行加载,因此Object类在程序的各种类加载器环境中都是同一个类

    41720

    类加载小结

    本节来学习类加载机制 什么是类加载 简单来说就是将.class文件实例成Class对象并进行初始化的过程,字节码必须通过类加载过程加载到JVM环境后才可以执行 classloder(类加载器)的使命就是将....class文件加载到内存中,在启动之初进行类的Load、Link和Init,在加载类时使用的是双亲委派模型 类加载 类加载过程 1 加载阶段读取类文件产生的二进制流并转为特定的数据结构,创建对应的...类加载器 字节码文件加载到内存就是通过类加载器来实现的,类加载器类似于原始部落结构存在权力等级,最高的一层是家族中威望最高的Bootstrap,它是jvm启动时创建的,是通过C来实现的,并不存在于JVM...中 双亲委派模型 类加载器之间的这种层次关系就是双亲委派模型。...双亲委派模型要求除了顶层的启动类加载器外,其他的类加载器都应有自己的父类加载器 这部分内容是对第一张图中加载这个方框部分的内容的拓展

    24220

    类加载过程

    类的生命周期 类加载过程 加载 验证 准备 解析 初始化 卸载 类的生命周期 一个类的完整生命周期如下: 类加载过程 Class 文件需要加载到虚拟机中之后才能运行和使用,那么虚拟机是如何加载这些...一个非数组类的加载阶段(加载阶段获取类的二进制字节流的动作)是可控性最强的阶段,这一步我们可以去完成还可以自定义类加载器去控制字节流的获取方式(重写一个类加载器的 loadClass() 方法)。...数组类型不通过类加载器创建,它由 Java 虚拟机直接创建。 类加载器、双亲委派模型也是非常重要的知识点,这部分内容会在后面的文章中单独介绍到。...该类没有在其他任何地方被引用 该类的类加载器的实例已被 GC 所以,在 JVM 生命周期内,由 jvm 自带的类加载器加载的类是不会被卸载的。但是由我们自定义的类加载器加载的类是可能被卸载的。...而我们自定义的类加载器的实例是可以被回收的,所以使用我们自定义加载器加载的类是可以被卸载掉的。 参考

    60620

    【Android 逆向】类加载器 ClassLoader ( 类加载时机 | 隐式加载 | 显示加载 | 类加载步骤 | 装载 | 链接 | 初始化 )

    文章目录 一、类加载时机 1、隐式加载 2、显式加载 二、类加载步骤 一、类加载时机 ---- 1、隐式加载 类加载 的 隐式加载 , 没有明确的说明加载某个类 , 但是进行了如下操作 : 使用 new...关键字 直接 创建类的实例对象 ; 使用 new 关键字 直接 创建类的 子类 实例对象 ; 通过 反射方式 创建 类 / 子类 实例对象 ; 访问 类的 静态变量 , 对静态变量 进行 读 或者 写...操作 都会触发 隐式加载 ; 访问 类的 静态函数 ; 2、显式加载 显式加载 : 明确的说明要加载某个类 , 使用 Class.forName() 加载指定的类 ; 使用 ClassLoader.loadClass...加载指令的类 ; 二、类加载步骤 ---- 参考 【Java 虚拟机原理】Java 类加载过程 ( 加载 | 连接 - 验证 准备 解析 | 初始化 | 使用 | 卸载 ) 博客 ; 类加载步骤 :...① 装载 : 加载某个类时 , 首先要 查找 并 导入 Class 字节码文件 ; ② 链接 : 该阶段 , 可以分为以下 3 个子阶段 ; 验证 : 验证字节码文件是否正确 ; 准备 :

    2.2K30

    JAVA类加载

    其实,类加载器并不需要等到某个类被“首次主动使用”时再加载它,JVM 规范允许类加载器在预料某个类将要被使用时就预先加载它,如果在预先加载的过程中遇到了.class 文件缺失或存在错误,类加载器必须在程序首次主动使用该类时才报告错误...相对于类加载的其他阶段而言,加载阶段是可控性最强的阶段,因为程序员可以使用系统的类加载器加载,还可以使用自己的类加载器加载。我们在最后一部分会详细介绍这个类加载器。...我们看到 java为我们提供了三个类加载器,应用程序都是由这三种类加载器互相配合进行加载的,如果有必要,我们还可以加入自定义的类加载器。这三种类加载器的加载顺序是什么呢?...3、双亲委派原则 他的工作流程是: 当一个类加载器收到类加载任务,会先交给其父类加载器去完成,因此最终加载任务都会传递到顶层的启动类加载器,只有当父类加载器无法完成加载任务时,才会尝试执行加载任务。...双亲委派原则归纳一下就是: **可以避免重复加载,父类已经加载了,子类就不需要再次加载更加安全,很好的解决了各个类加载器的基础类的统一问题,如果不使用该种方式,那么用户可以随意定义类加载器来加载核心

    1.1K75

    类加载机制

    类加载机制 Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程被称作虚拟机的类加载机制。...加载阶段既可以使用Java虚拟机里内置的类加载器来完成,也可以由用户自定义的类加载器去完成,开发人员通过定义自己的类加载器去控制字节流的获取方式(重写一个类加载器的findClass()或loadClass...,那虚拟机将会把代表N的全限定名传递给D的类加载器去加载这个类C。...在加载过程中,由于元数据验证、字节码验证的需要,又可能触发其他相关类的加载动作,例如加载这个类的父类或实现的接口。一旦这个加载过程出现了任何异常,解析过程就将宣告失败。...连接之初始化 类的初始化阶段是类加载过程的最后一个步骤,之前介绍的几个类加载的动作里,除了在加载阶段用户应用程序可以通过自定义类加载器的方式局部参与外,其余动作都完全由Java虚拟机来主导控制。

    64220

    类加载过程

    类的生命周期 加载->连接->初始化->使用->卸载 其中连接包括:验证->准备->解析 类加载过程 Class文件需要加载到虚拟机之后才能运行。...系统加载Class文件的步骤:加载->连接->初始化。 加载 1.通过全类名加载该类对应的二进制字节流。 2.将该二进制字节流代表的静态存储结构存到方法区的运行时数据结构中。...一个非数组类的加载阶段可控性最强,可以在这个阶段自定义类加载器去控制字节流的获取方法(重写类加载器的classLoad()方法)。数组类型不通过类加载器创建,他直接由JVM创建。...加载和连接阶段的部分阶段是可以交叉执行的,加载阶段尚未结束,连接过程可能就开始了。 验证 文件格式验证。 元数据验证。 字节码验证。 符号引用验证。 准备 准备阶段为类变量分配内存并赋初始值的过程。...3.加载该类的类加载器被GC。 参考:JavaGuide

    40510

    类加载器

    名称 加载哪的类 说明Bootstrap(引导类加载器) ClassLoader JAVA_HOME/lib,无法直接访问(平台相关的底层C/C++语言实现, 所以该加载器不能被...用户可以自己定义类加载器来加载类。...逻辑是从自定义加载器一直往上父类加载器递归调用,直到扩展类加载器发现没有parent了,就会去查看引导类加载器加没加载过该类。...加载顺序应该是先查看引导类加载器是否加载,再由父类加载器尝试加载,最后是子类加载器自己加载。...双亲委派:向上委派过程:第一步: 将自定义加载器挂载到应用程序类加载器;第二步: 应用程序类加载器将请求委托给扩展类加载器;第三步: 扩展类加载器将请求委托给启动类加载器。

    8100

    类的加载

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

    28810
    领券