没有合适的资源?快使用搜索试试~ 我知道了~
文章目录前言1. 类加载机制1.1 加载1.2 验证1.3 准备1.4 解析1.5 初始化1.5.2 为什么静态方法不能调用非静态方法1.6 使用1.7 拆卸2. 类加载器2.1 类加载器种类2.1.1 Java虚拟机自带的类加载器2.1.2 用户自定义的类加载器2.2 双亲委派机制2.2.1 为什么要有双亲委派机制2.2.2 可不可以自定义一个String/Object类?2.3 破坏双亲委派2.3.1 为何要破坏双亲委派机制?2.3.2 如何破坏双亲委派机制?结尾 前言 忽然间思考到一个问题:为什么静态方法、变量不能调用非静态方法、变量?思考一番,忽然想起类加载的顺序,结合之前的基础知
资源推荐
资源详情
资源评论
深入浅出类加载机制深入浅出类加载机制
文章目录文章目录前言1. 类加载机制1.1 加载1.2 验证1.3 准备1.4 解析1.5 初始化1.5.2 为什么静态方法不能调用非静态方法1.6 使用1.7 拆卸2. 类加载器2.1 类加载器种类
2.1.1 Java虚拟机自带的类加载器2.1.2 用户自定义的类加载器2.2 双亲委派机制2.2.1 为什么要有双亲委派机制2.2.2 可不可以自定义一个String/Object类?2.3 破坏
双亲委派2.3.1 为何要破坏双亲委派机制?2.3.2 如何破坏双亲委派机制?结尾
前言前言
忽然间思考到一个问题:为什么静态方法、变量不能调用非静态方法、变量?思考一番,忽然想起类加载的顺序,结合之前的基础知识点,就有了今天的这篇
文章
1. 类加载机制类加载机制
先贴个图吧,显而易见的静态方法、变量不能调用非静态方法、变量,然后就是我们的类加载机制:
我们知道Java是跨平台的,即 Write Once,Run Anywhere,而我们通过编译Java生成的class文件是与平台无关的。所以我们需要不同的JVM(Liunx版本、
Windows版本等)来加载我们编译生成的Class文件。而去虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被
虚拟机直接使用的Java类型的这个机制,就是虚拟机的类加载机制。贴个图:
按照顺序
1.1 加载加载
类的加载指的是通过全限定名来获取其定义的二进制字节流通过全限定名来获取其定义的二进制字节流将类的 .class 文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区放在运行时数据区的方法区内,然后在堆堆
区区创建一个 java.lang.Class 对象,用来封装类在方法区内的数据结构数据结构。
加载.class文件的方式
从本地系统中直接加载
通过网络下载 .class 文件(URLClassLoader)
从 zip、jar 等归档文件中加载 .class 文件
从专有数据库中提取 .class 文件
将 Java源文件动态编译为 .class 文件
1.2 验证验证
该阶段的主要作用就是确保被加载的类的正确性,具体可包含:
文件格式的验证:文件格式的验证: 验证.class文件字节流是否符合class文件的格式的规则,并且能够被当前版本的虚拟机处理。这里面主要对魔数、主版本号、常量池等等的校验
(魔数、主版本号都是.class文件里面对象头包含的数据信息:Java对象头)。
元数据验证:元数据验证: 主要是对字节码描述的信息进行语义分析,以保证其描述的信息符合java语言规范的要求。
字节码验证:字节码验证: 这是整个验证过程最复杂的阶段,主要是通过数据流和控制流分析,确定程序语义是合法的、符合逻辑的。在元数据验证阶段对数据类型做出验证
后,这个阶段主要对类的方法做出分析,保证类的方法在运行时不会做出危害虚拟机安全的事。
符号引用验证:符号引用验证: 它是验证的最后一个阶段,发生在虚拟机将符号引用转化为直接引用的时候。主要是对类自身以外的信息进行校验。目的是确保解析动作能够完
成。
1.3 准备准备
资源评论
weixin_38575536
- 粉丝: 3
- 资源: 927
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功