JVM 字节码的结构

编译的.class文件,可以用javap进行反编译

javap Test.class

javap -c Test.class

javap -verbose Test.class

1、创建MyTest1.java

public class MyTest1 {
    private int a = 1;

    public MyTest1() {
    }

    public int getA() {
        return this.a;
    }

    public void setA(int a) {
        this.a = a;
    }
}

使用D:\workspace\study\ jvm_demo\build\classes\java\main\com\example\jvm\bytecode>javap -verbose  MyTest1.class

Classfile /D:/workspace/study/ jvm_demo/build/classes/java/main/com/example/jvm/bytecode/MyTest1.class
  Last modified 2019-6-23; size 495 bytes
  MD5 checksum 54c0850cfabb7f115919c93e556e3630
  Compiled from "MyTest1.java"
public class com.example.jvm.bytecode.MyTest1
  SourceFile: "MyTest1.java"
  minor version: 0
  major version: 51
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
   #1 = Methodref          #4.#20         //  java/lang/Object."<init>":()V
   #2 = Fieldref           #3.#21         //  com/example/jvm/bytecode/MyTest1.a:I
   #3 = Class              #22            //  com/example/jvm/bytecode/MyTest1
   #4 = Class              #23            //  java/lang/Object
   #5 = Utf8               a
   #6 = Utf8               I
   #7 = Utf8               <init>
   #8 = Utf8               ()V
   #9 = Utf8               Code
  #10 = Utf8               LineNumberTable
  #11 = Utf8               LocalVariableTable
  #12 = Utf8               this
  #13 = Utf8               Lcom/example/jvm/bytecode/MyTest1;
  #14 = Utf8               getA
  #15 = Utf8               ()I
  #16 = Utf8               setA
  #17 = Utf8               (I)V
  #18 = Utf8               SourceFile
  #19 = Utf8               MyTest1.java
  #20 = NameAndType        #7:#8          //  "<init>":()V
  #21 = NameAndType        #5:#6          //  a:I
  #22 = Utf8               com/example/jvm/bytecode/MyTest1
  #23 = Utf8               java/lang/Object
{
  public com.example.jvm.bytecode.MyTest1();
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: aload_0
         5: iconst_1
         6: putfield      #2                  // Field a:I
         9: return
      LineNumberTable:
        line 6: 0
        line 8: 4
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
               0      10     0  this   Lcom/example/jvm/bytecode/MyTest1;

  public int getA();
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: getfield      #2                  // Field a:I
         4: ireturn
      LineNumberTable:
        line 12: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
               0       5     0  this   Lcom/example/jvm/bytecode/MyTest1;

  public void setA(int);
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=2, args_size=2
         0: aload_0
         1: iload_1
         2: putfield      #2                  // Field a:I
         5: return
      LineNumberTable:
        line 16: 0
        line 17: 5
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
               0       6     0  this   Lcom/example/jvm/bytecode/MyTest1;
               0       6     1     a   I
}

  

2、使用WinHex打开MyTest1.class文件

1、使用javap -verbose命令分析一个字节码文件时,将会分析该字节码文件的魔数、版本号、常量池、类的构造方法、类中的方法信息、类变量与成员变量等信息。
2、魔数: 所有的.class字节码文件的前4个字节都是魔数,魔数值为固定值: 0xCAFEBABE.
3、

3、Class文件结构中常量池中11种数据类型的结构总表

原文地址:https://www.cnblogs.com/linlf03/p/11074069.html

时间: 2024-11-08 19:43:33

JVM 字节码的结构的相关文章

JVM总结(五):JVM字节码执行引擎

JVM字节码执行引擎 运行时栈帧结构 局部变量表 操作数栈 动态连接 方法返回地址 附加信息 方法调用 解析 分派 –“重载”和“重写”的实现 静态分派 动态分派 单分派和多分派 JVM动态分派的实现 基于栈的字节码解释执行引擎 基于栈的指令集与基于寄存器的指令集 JVM字节码执行引擎 虚拟机是相对于“物理机”而言的,这两种机器都有代码执行能力,其区别主要是物理机的执行引擎是直接建立在处理器.硬件.指令集和操作系统层面上的,而虚拟机的执行引擎是自己实现的.因此程序员可以自行制定指令集和执行引擎的

JVM字节码增强

JVM——字节码增强技术简介 Java字节码增强指的是在Java字节码生成之后,对其进行修改,增强其功能,这种方式相当于对应用程序的二进制文件进行修改.Java字节码增强主要是为了减少冗余代码,提高性能等. 实现字节码增强的主要步骤为: 1.修改字节码 在内存中获取到原来的字节码,然后通过一些工具(如 ASM,Javaasist)来修改它的byte[]数组,得到一个新的byte数组. 2.使修改后的字节码生效 有两种方法: 1) 自定义ClassLoader来加载修改后的字节码: 2)替换掉原来

jvm字节码简介

1.概述 java虚拟机的指令由一个字节长度的.代表着某种特定操作含义的数字(成为操作码,Opcde)和跟随其后的0到多个此操作所需参数(操作数,Operands).由于操作码的长度为一个字节,所以指令集的操作数总数不能超过256条:又由于Class文件放弃了编译后代码的操作数对齐,所以虚拟机在处理超过一个字节的数据时会从字节中重建出具体的数据格式,例如一个16的长度的无符号整数会使用两个无符号字节存储(byte1.byte2),它们的值为  byte1 << 8 | byte2.对于大部分与

JVM——字节码增强技术简介

Java字节码增强指的是在Java字节码生成之后,对其进行修改,增强其功能,这种方式相当于对应用程序的二进制文件进行修改.Java字节码增强主要是为了减少冗余代码,提高性能等. 实现字节码增强的主要步骤为: 1.修改字节码 在内存中获取到原来的字节码,然后通过一些工具(如 ASM,Javaasist)来修改它的byte[]数组,得到一个新的byte数组. 2.使修改后的字节码生效 有两种方法: 1) 自定义ClassLoader来加载修改后的字节码: 2)替换掉原来的字节码:在JVM加载用户的C

JVM字节码格式

字节码格式 字节码是JVM的机器语言.JVM加载类文件时,对类中的每个方法,它都会得到一个字节码流.这些字节码流保存在JVM的方法区中.在程序运行过程中,当一个方法被调用时,它的字节码流就会被执行.根据特定JVM设计者的选择,它们可以通过解释的方式,即时编译(Just-in-time compilation)的方式或其他技术的方式被执行. 方法的字节码流就是JVM的指令(instruction)序列.每条指令包含一个单字节的操作码(opcode)和0个或多个操作数(operand).操作码指明要

java面试题jvm字节码的加载与卸载

虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验,转换分析和初始化,最终形成可以被虚拟节直接使用的JAVA类型,这就是虚拟机的类加载机制. 类从被加载到虚拟机内存到卸载出内存的生命周期包括:加载->连接(验证->准备->解析)->初始化->使用->卸载 初始化的5种情况: 1.使用new关键字实例化对象时,读取或设置一个类的静态字段,除被final修饰经编译结果放在常量池的静态字段,调用类的静态方法时. 2.使用java.lang.reflect包方法对

JVM字节码之整型入栈指令(iconst、bipush、sipush、ldc)

官网:http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html 原文地址:http://www.linmuxi.com/2016/02/25/jvm-int-pushstack-01/ 本篇主要分享下在JVM中int类型数值采用何种指令入栈的,根据int值范围JVM入栈字节码指令就分为4类,下面分别介绍下这四类指令. 前言 当int取值-1~5采用iconst指令,取值-128~127采用bipush指令,取值-32768~327

JVM --字节码的加载

ClassLoader类加载器 常见的类加载器有BootStrapClassLoader<-ExtClassLoader<-AppClassLoader<-用户ClassLoader BootStrapClassLoader:加载Java自带的核心类: ExtClassLoader加载在/jre/lib/ext目录下的jar包,同样用户可以将jar放在该目录下. AppClassLoader 加载classpath下面的内容, 加载过程: 读取文件并加载,首先申请父类的加载器进行加载,如

JVM | 字节码指令基础

操作数栈管理指令 1)pop.pop2:将操作数栈的栈顶一个或两个元素出栈.2)dup.dup2.dup_x1.dup2_x1.dup_x2.dup2_x2:复制栈顶一个或两个数值并将复制值或双份的复制值重新压入栈顶.3)swap:将栈最顶端两个数值互换. public static void main(String[] args) { heavyMethod(); } 对应的字节码: public static void main(java.lang.String[]); Signature: