class文件 字节码指令

字节码指令:

  • short范围的整数是跟字节码存储在一起;

  • 超过short整数范围,则会存储在运行时常量池中;

    • 将byte的数据压入操作数栈,int是4个字节,所以剩下的3个字节,会补齐,正数补0,负数1;
    • 同理shrot也是,这里的byte 和short都是从方法区的压入的操作数栈,
    • int和long是从常量池压入栈,而且long是8字节,会压入两次;
  • 常量池主要存储字节码中的常量池;

  • 方法区的字节码,主要放入方法区;

    • 字节码方法的执行是,先准备好对象 + 参数,在调用方法;
  • 栈帧内:存放局部变量+ 操作数栈【存储字节码指令和数据】;

  • 注意 a++字节码执行指令:

    • iinc指令直接在局部变量slot【槽】上进行运算;
    • a++和++a的区别是先执行 iload还是先执行iinc;
    • 字节码中,操作数栈是四字节,byte,short,char都会按照int作比较;
    • goto:用来跳转指定行号的字节码;
  • 代码的构造器方法:

    • void cinit():会按照从上至下的顺序收集所有static静态代码块和静态成员复制的代码,合并成为一个特殊的方法:cinit();
    • void init():会按照从上至下的顺序,收集所有{}代码块和成员变量赋值的代码,形成新的构造方法,但原始构造方法内的代码总是在最后执行;
    • 在对属性的操作中,是先获取对象的this,通过this获取对象的属性,从而进行赋值;
    • 类变量存在先赋值,再声明的情况:
      • java编译器在处理类时,会将所有成员变量的声明(不包括初始化赋值)提升到类作用域的顶部。
  • 方法调用:

    • invokespecial:构造方法,私有方法,final方法;

    • invokevirtual:public普通方法,存在重写,动态绑定;

    • invokestatic:静态方法,

      其中,invokespecial 和 invokestatic 在编译阶段就能确定所有调用的方法;

      • 静态方法通过对象调用的时候,会首先加载this对象,然后pop()它;
    • 多态原理:

      • 对象内部存在一个vtable表,在类的加载阶段就会生成,用来记录;
        1. 通过栈帧中的对象引用,找到对象,
        2. 分析对象头【16字节:前8是hash码和锁标记】,找到对象的实际Class【后8字节】;
        3. 在Class结构中由vtbale,他是在类加载的链接阶段,根据方法的重写规则生成好的;
        4. 根据表查找到方法的具体地址;
        5. 执行方法的字节码;
    • new关键字:

      • 首先在堆中,开辟对象空间,并返回引用地址;
      • 然后复制一份引用地址,之后利用操作数栈顶调用构造器方法,结束后pop()栈顶;
      • 最后将操作数栈的另一份地址赋值给对象变量slot【槽】;
posted @ 2025-03-18 11:34  烟雨断桥  阅读(10)  评论(0)    收藏  举报