• jvm:java类文件结构(字节码文件的解析)


    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)访问标志:紧接着常量池之后的两个字节代表访问标志,用于识别类或接口的访问信息

  • 相关阅读:
    如何把git上的小程序项目跑起来
    异常好用的六种vue组件通信方式
    2021.8.10面试总结
    高频面试题总结
    21年8.6面试总结
    2021.8.4上海微创软件(主react)电话面试
    promis封装各种请求
    各个框架解决跨域问题
    华人运通(主vue)前端研发初级工程师
    css常用命名
  • 原文地址:https://www.cnblogs.com/zhai1997/p/12553735.html
Copyright © 2020-2023  润新知