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

  • 相关阅读:
    [大数据从入门到放弃系列教程]在IDEA的Java项目里,配置并加入Scala,写出并运行scala的hello world
    [大数据从入门到放弃系列教程]第一个spark分析程序
    Mac配置Scala和Spark最详细过程
    Mac配置Hadoop最详细过程
    [从零开始搭网站八]CentOS使用yum安装Redis的方法
    CentOS磁盘用完的解决办法,以及Tomcat的server.xml里无引用,但是项目仍启动的问题
    Mysql 删除重复数据只保留id最小的
    bootstrap媒体查询常用写法
    Arduino Uno 在win7 64位下的驱动问题
    VS项目模板文件位置
  • 原文地址:https://www.cnblogs.com/zhai1997/p/12553735.html
Copyright © 2020-2023  润新知