1、java虚拟机简介
不是只有java编译器才能完成java程序到字节码的编译过程
(2)定义
java二进制字节码的运行环境
(3)好处
一次编写,到处运行的基础
自动内存管理,垃圾回收功能,大大减轻了程序员的负担
数组下标越界检查
多态
(4)比较
2、字节码文件(.class)的组成内容
无符号数:就是数值
表:一个结构
3、常量池(主要存放字面量和符号引用)
(1)字面量
String string1="cunnuanhuakai";
字面量就是等或右边的值,即:cunnuanhuakai
(2)符号引用:包括三类常量
类和接口的全限定名:
pers.zhb.web.servlet.IndexServlet
字段的名称和描述符:
private、public等
方法的名称和描述符:
private、public等
4、在Notepad++中安装插件
(1)下载插件
(2)将下载的插件放到Notepad++安装目录的plunges目录下
(3)导入插件
(4)按8bit的方式查看class文件:
5、字节码文件的解析
(1)11种数据类型结构表:
图片来源:(https://blog.csdn.net/qq_39375211/article/details/79925127)
u1:一个字节
u2:两个字节... ...
(2)字节码文件的解析(字节码文件为二进制,只是查看方便显示十六进制)
查看字节码文件(转换为16进制):
要进行解析需要将16进制转化为十进制,然后,对应结构表。
0a:十进制为10,对应表格中的Methodref,又由于索引项每一个占了两字节,因此,索引项分别为14和38
运行:javap -v 命令对解析结果进行验证:
程序源码:
public class Student { private String name; private Integer age; public Student(String name, Integer age) { this.name = name; this.age = age; } public void testPara(Student student1){ student1.name="zhang"; } public void testPara1(Student student2){ student2=new Student("liu",11); } public static void main(String args[]){ Student student=new Student("zhai",12); student.testPara(student); System.out.println(student.name); student.testPara1(student); System.out.println(student.name); } }
(3)clinit与init:
clinit:所有的类变量初始化语句和静态初始化语句
init:调用new初始化对象的时候
调用反射的时候(newInstance())
调用clone方法的时候
序列化的时候
(4)虚拟机的执行过程
(5)访问标志:紧接着常量池之后的两个字节代表访问标志,用于识别类或接口的访问信息