一、类加载器学习小结

学习渠道:尚硅谷

1.理解类加载器加载对象

  • .java文件编译后会生成*.class*文件,那么在.class文件需要运行时,如何将这些物理磁盘等等上的.class文件加载到JVM上呢,此时,类加载器发挥了作用。
  • 类加载简要流程 .class --> JVM --> JVM内存中的各种元数据

2.类的加载过程

1. 加载Loading

- 主要做了3个工作:【不只局限本地磁盘系统加载】
	- 通过该类全类名获取该类相应的二进制字节流
	- 将该字节流存储的内容按照约定规则【许多字节是JVM识别的标识,诸如常量池的起始位置等等】转化为方法区的运行时数据结构
	- 内存中生成Java.lang.Class对象,该对象给我们提供了一个访问该对象方法区中各种数据的入口

在这里插入图片描述

2. 链接Linking{验证Verification 准备preparation 解析Resoulution}

- 验证Verification
	- 保证被加载类的正确性,以至于危害到JVM自身安全
- 准备preparation
	- 类变量设置**初始值**
	- 用**final** 修饰的 **static变量** 直接**显式**初始化[值即为执行值]
	- 实例变量则随着对象一同进入Java堆中
- 解析Resoulution

3. 初始化Initialization

- 我们可以理解为该阶段就是执行<clinit>()方法的过程
- 该方法是javac编译器自动收集所有类变量的赋值动作和静态代码块中的语句【前面初始化,这边赋值】
- 上述操作的顺序是按照语句在源文件中出现的顺序 顺序执行的
- 类的构造器是<init>()方法,二者是具有区别的
- 执行的**原则**还是:**由父及子**
- 类的初始化阶段<clinit>()方法在**多线程情况下是同步加锁的**
	- 验证Demo 【】

在这里插入图片描述在这里插入图片描述

3.类的加载器分类 (Java核心类是引导类加载器加载的,出于安全考虑,Bootstrap 启动类加载器只加载包名为java/javax/sum 开头的类)

  • 引导类加载器 Bootstrap ClassLoader [C C++ 编写,到达获取父加载器时,引导类加载器显示为null]
  • 自定义加载器 User-Defined ClassLoader
  • 在这里插入图片描述
  • 获取类加载器
    在这里插入图片描述
  • 虚拟机自带的加载器 扩展类加载器
    在这里插入图片描述
    在这里插入图片描述
  • 用户自定义类加载器
    在这里插入图片描述
    在这里插入图片描述
    在自定义类加载器中,我们可以对.class进行解密操作(加密是为了防止反编译)
  • 实现步骤
    在这里插入图片描述
  • 获取ClassLoader的途径
    在这里插入图片描述

4.双亲委派机制 【由父及子】

在这里插入图片描述

  • 系统类加载器加载jdbc.jar
    在这里插入图片描述

5.双亲委派机制优势

1.避免类的重复加载
2.保护程序安全,防止核心api被篡改

6.沙箱安全机制介绍

在这里插入图片描述

  • 在jvm中判断两个class对象是否为同一个类存在两个必要条件
    在这里插入图片描述

7.类的主动使用以及被动使用

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值