`
haiyupeter
  • 浏览: 425989 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

jvm指令解析

    博客分类:
  • Java
阅读更多
//源代码

class TT{

       static int tt = 5;

       int t;

       public TT(){

              System.out.println("TT");

       }

}

 

public class ArrayTest extends TT{

       public ArrayTest(){

              super();

              System.out.println("test");

       }    

       static {

              int c = 5;

       }

       static int b = 1;

       int A[] = {1,4,5,12,34,123,14,32};

      

       static {

              int d = 6;

       }

       public static void main(String[] args) {

              ArrayTest a = new ArrayTest();

              int i = 2;

              System.out.println(a.A[i++]);

              System.out.println(i);

       }

}

//javap -c 反编译代码

D:\>javap -c TT

Compiled from "ArrayTest.java"

class TT extends java.lang.Object{

static int tt;

 

int t;

 

public TT();

  Code:

   0:   aload_0

   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V

   4:   getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;

   7:   ldc     #3; //String TT

   9:   invokevirtual   #4; //Method java/io/PrintStream.println:(Ljava/lang/St

ing;)V

   12:  return

 

static {};

  Code:

   0:   iconst_5

   1:   putstatic       #5; //Field tt:I

   4:   return

 

}

 

 

 

 

D:\>javap -c ArrayTest

Compiled from "ArrayTest.java"

public class ArrayTest extends TT{

static int b;

 

int[] A;

 

public ArrayTest();

  Code:

   0:   aload_0

   1:   invokespecial   #1; //Method TT."<init>":()V

   4:   aload_0

   5:   bipush  8

   7:   newarray int

   9:   dup

   10:  iconst_0

   11:  iconst_1

   12:  iastore

   13:  dup

   14:  iconst_1

   15:  iconst_4

   16:  iastore

   17:  dup

   18:  iconst_2

   19:  iconst_5

   20:  iastore

   21:  dup

   22:  iconst_3

   23:  bipush  12

   25:  iastore

   26:  dup

   27:  iconst_4

   28:  bipush  34

   30:  iastore

   31:  dup

   32:  iconst_5

   33:  bipush  123

   35:  iastore

   36:  dup

   37:  bipush  6

   39:  bipush  14

   41:  iastore

   42:  dup

   43:  bipush  7

   45:  bipush  32

   47:  iastore

   48:  putfield        #2; //Field A:[I

   51:  getstatic       #3; //Field java/lang/System.out:Ljava/io/PrintStream;

   54:  ldc     #4; //String test

   56:  invokevirtual   #5; //Method java/io/PrintStream.println:(Ljava/lang/St

ing;)V

   59:  return

 

public static void main(java.lang.String[]);

  Code:

   0:   new     #6; //class ArrayTest

   3:   dup

   4:   invokespecial   #7; //Method "<init>":()V

   7:   astore_1

   8:   iconst_2

   9:   istore_2

   10:  getstatic       #3; //Field java/lang/System.out:Ljava/io/PrintStream;

   13:  aload_1

   14:  getfield        #2; //Field A:[I

   17:  iload_2

   18:  iinc    2, 1

   21:  iaload

   22:  invokevirtual   #8; //Method java/io/PrintStream.println:(I)V

   25:  getstatic       #3; //Field java/lang/System.out:Ljava/io/PrintStream;

   28:  iload_2

   29:  invokevirtual   #8; //Method java/io/PrintStream.println:(I)V

   32:  return

 

static {};                                                                                                                

  Code:

   0:   iconst_5                                                                                                    

   1:   istore_0

   2:   iconst_1

   3:   putstatic       #9; //Field b:I

   6:   bipush  6

   8:   istore_0

   9:   return

 

}

 

//第一部分  父类 请先看静态块部分

//代码详解:     --为本人做的注释

D:\>javap -c TT

Compiled from "ArrayTest.java"

class TT extends java.lang.Object{

static int tt;                      --类静态成员变量

 

int t;                                                                                                   --非静态类成员变量

 

public TT();

  Code:

   0:   aload_0                                                                                                                                                                           --aload_0 装载局部变量0位置对象压入栈顶,注意:aload指令为装类实例,_0表示从局部变量的位置                                                                                            

   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V                                                                                          --invokespecial调用父类方法,使用的是栈顶对象,调用完后栈顶元素出栈,#1表示的是方法名在常量解析池中的位置

   4:   getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;                                                

             --取得System类的静态成员 ,#2表示常量解析池中的第二个位置

   7:   ldc     #3; //String TT                                                                                 

             --新建一个String对象指向常量池中的#3,内容是TT,入栈

   9:   invokevirtual   #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V      

             --调用类实例方法参数与对象都同时出栈

  12:  return                                                                                                                                                                            --返回

 

static {};

  Code:

   0:   iconst_5                                                                                                            

        --声明一个整形常量为5入栈,iconst_5中的i表示int,当然可以换成f的放就是float型了,const表示常量,5表示数值

   1:   putstatic       #5; //Field tt:I                            

        --putstatic当栈顶元素出栈放到常量解析池中的#5位置

   4:   return    

         --返回

 

}

 

 

 

//第二部分,子类  请先看静态块部分

D:\>javap -c ArrayTest

Compiled from "ArrayTest.java"

public class ArrayTest extends TT{

static int b;

 

int[] A;

 

public ArrayTest();

  Code:

   0:   aload_0                                                                                                                                                       

               --将局部变量0位置对象取出来,压入栈push

   1:   invokespecial   #1; //Method TT."<init>":()V                    

              --调用父类构造方法,并出栈pop

   4:   aload_0                                                                                                                                                       

              --将将局部变量0位置对象取出来,压入栈push

   5:   bipush  8                                                                                                                                             

              --将(byte)字节8转换成int然后压入栈push

   7:   newarray int                                                                                                                                  

              --新建一个数组前面的8 pop出栈,生成的数组对象再压入栈push

   9:   dup                                                                                                                                                                    

              --复制当前栈顶对象,再压入栈push  (此时栈里,一个类实例对象,两个数组对象)

   10:  iconst_0                                                                                                                                            

              --将整形常量0压入栈(作为数值在数组中的存放位置)push

   11:  iconst_1                                                                                                                                   

              --将整形常量1压入栈(作为存入数组中的值)push

   12:  iastore                                                                                                                                         

              --数据元素操作指令:在位置上放入刚存入的值pop 1 ;pop 0; pop 数组对象

  13:  dup                                                                                                                                                                    

           --再复制数组压入栈,后面的指令与9-12的一样;

   14:  iconst_1

   15:  iconst_4

   16:  iastore

   17:  dup

   18:  iconst_2

   19:  iconst_5

   20:  iastore

   21:  dup

   22:  iconst_3

   23:  bipush  12

   25:  iastore

   26:  dup

   27:  iconst_4

   28:  bipush  34

   30:  iastore

   31:  dup

   32:  iconst_5

   33:  bipush  123

   35:  iastore

   36:  dup

   37:  bipush  6

   39:  bipush  14

   41:  iastore

   42:  dup

   43:  bipush  7

   45:  bipush  32

  47:  iastore                                                                                                                                                                                --此时栈里存放类实例对象,和数组实例对象.

   48:  putfield        #2; //Field A:[I                    

                  --putfield指把栈顶对象pop,然后赋值给常量解析池中的#2位置          

   51:  getstatic       #3; //Field java/lang/System.out:Ljava/io/PrintStream;

                    --取出静态成员变量push入栈,常量解析池中的#3位置

   54:  ldc     #4; //String test                                       

                  --新建一个字符串对象test入栈push

   56:  invokevirtual   #5; //Method java/io/PrintStream.println:(Ljava/lang/Sting;)V

                  --调用类实例方法,方法名在常量解析池中的#5位置,同时pop

   59:  return


public static void main(java.lang.String[]);

  Code:

   0:   new     #6; //class ArrayTest                                                                                                                                                   --新建一个ArrayTest对象,  名字在常解析池的#6位置,入栈push

   3:   dup                                                                                      

                     --复制当前栈顶对象,再压入栈push 

   4:   invokespecial   #7; //Method "<init>":()V                                                                                                                                    --调用父类构造方法pop

   7:   astore_1                                                                                                                                                                                    --将返回对象放到局部变量位置1,pop

   8:   iconst_2                                                                                                                                                                                   --新建常量2入栈push

   9:   istore_2                                                                                                                                                                                    --将栈顶元素保存到局部变量位置2,pop

   10:  getstatic       #3; //Field java/lang/System.out:Ljava/io/PrintStream;                            

                     --取出常量解析池中的#3位置的变量名,取得其静态对象入栈push

   13:  aload_1                                                                                                                                                                                     --将局部变量中位置1的对象取出入栈push

   14:  getfield        #2; //Field A:[I                                                                                                                                                  --取出其属性#2

   17:  iload_2                                                                                                                                                                                     --取出局部变量位置2的整型数据入栈

   18:  iinc    2, 1                                                                                                                                                                             --将栈顶元素自加1再入栈

   21:  iaload                                                                                                                                                                                      --装栈一个数组的第几个数入栈

   22:  invokevirtual   #8; //Method java/io/PrintStream.println:(I)V                                                                                   

                      --调用打印方法

   25:  getstatic       #3; //Field java/lang/System.out:Ljava/io/PrintStream;                              

                   --取出常量解析池中的#3位置的变量名,取得其静态对象入栈push

   28:  iload_2                                                                                    

                    --取出局部变量位置2的整型数据入栈

   29:  invokevirtual   #8; //Method java/io/PrintStream.println:(I)V                                                                                   

                    --调用打印方法

  32:  return                                                                                                                                                                                          --返回

 

static {};                                                                                               

               --java虚拟机把所有的静态块以及静态成员都放在一个静态块里执行了,顺序也就是在类里写定义的顺序.

  Code:

   0:   iconst_5       

              --声明一个整型5压入栈顶  push

   1:   istore_0                                                                                      

               --取出栈顶元素,存到局部变量位置0   pop

   2:   iconst_1                                                                                          

               --声明整形变量1压入栈顶  push

   3:   putstatic       #9; //Field b:I 

               --根据常量解析池位置#9 ,pop 将变量存到位置#9

   6:   bipush  6                                                                                    

               --bipush将(byte)字节形转换成(int)整形,并且压入栈push

   8:   istore_0                                                                                  

               --取出栈顶元素,存到局部变量位置0   pop  --因为相对于第0和第1名,第6和第8句是在新的静态代码段里面的,所以用的栈也不相同

   9:   return

 

}
 
分享到:
评论

相关推荐

    JVM指令操作解析及指南手册.pdf

    本手册将深入解析JVM指令,特别是数值类型操作、常量推送、变量加载等操作指令。 首先,简单数值类型的指令操作主要指的是将基础的数值类型如int、long、float和double等推送到操作数栈顶。这类操作包括iconst_m1、...

    JVM指令码表.zip

    首先,我们来了解下JVM指令的基本结构。每个字节码由一个单字节的操作码(opcode)和可能跟随的操作数组成。操作码决定了这条指令要执行的动作,比如加载、存储、运算、控制流程等。操作数则提供了指令执行所需的...

    JVM指令集 PDF 下载

    本篇将深入探讨JVM指令集,帮助你更好地理解Java程序的内部工作原理。 JVM指令集,也称为字节码指令集,是一系列二进制编码的指令,每个指令都对应一个特定的操作。这些指令在Java源代码被编译成.class文件时生成,...

    JVM指令手册.pdf

    ### JVM指令手册解析 #### 一、概述 Java虚拟机(JVM)是Java语言的核心执行环境,它负责解释和执行Java字节码。为了更好地理解Java程序在JVM中的执行流程,了解JVM指令集至关重要。本文档将详细介绍《JVM指令手册》...

    jvm指令手册

    JVM指令集是其内部工作原理的基础,每条指令都有特定的功能,用于构建和执行Java应用程序。下面我们将深入探讨JVM指令手册中的关键概念和知识点。 1. **字节码**:Java源代码编译后生成的是字节码文件(.class),...

    JVM指令码表.htm

    jvm指令码参照表,可以根据此表找到javap命令解析出来的文件进行翻译。 0x01 aconst_null null值入栈。 0x02 iconst_m1 -1(int)值入栈。 0x03 iconst_0 0(int)值入栈。 0x04 iconst_1 1(int)...

    JVM指令的使用深入详解

    JVM指令的执行是CPU与JVM之间的交互,CPU通过解析和执行这些指令来完成Java程序的运算。了解这些指令的用法,可以帮助开发者更有效地编写和优化Java代码。例如,减少不必要的计算,利用常量池来优化内存访问,以及更...

    JVM指令

    **JVM指令详解** 在Java开发中,JVM(Java虚拟机)是执行Java程序的核心组件,它负责解析字节码并将其转换为操作系统可理解的机器指令。JVM指令是构成Java字节码的基本元素,理解这些指令有助于优化代码性能、排查...

    JVM指令集

    ### JVM指令集详解 #### 一、aaload:数组元素加载指令 **操作说明:** `aaload` 是一个用于从引用类型数组中加载元素到操作数栈顶的操作。 **格式:** ``` aaload ``` **指令形式:** ``` aaload = 50 (0x32) `...

    JVM图解-JVM指令-JVM原型图.rar

    在这个压缩包中,"JVM图解.png"可能是对JVM内部结构的可视化表示,"JVM图解"可能是一个详细的文档,解释了JVM的工作原理,而"JVM指令手册 中文版"则提供了JVM可执行的所有指令的详细信息。下面,我们将深入探讨JVM的...

    JVM指令查询手册.rar

    《JVM指令查询手册》是Java开发者不可或缺的参考资料,它深入解析了Java虚拟机(JVM)中的各种操作指令,帮助我们理解JVM的工作机制,优化代码执行效率,解决性能问题。JVM作为Java程序运行的平台,其内部运作原理...

    Java-JVM指令手册(2022最新版,中文全解析)

    本手册全面解析了JVM指令,帮助开发者深入理解Java代码在运行时的内部工作原理。以下是对JVM指令的一些关键知识点的详细阐述: 1. **字节码**:Java源代码被编译成一种平台无关的二进制格式,称为字节码。这种中间...

    00-JVM指令手册.zip

    "00-JVM指令手册.zip"包含的"00-JVM指令手册.pdf"很可能是对JVM字节码指令的详细解析,这对于深入理解Java程序的运行机制至关重要。下面将详细介绍JVM指令集及其相关知识点。 1. **JVM字节码**:Java源代码被编译成...

    Java JVM程序指令码实例解析

    通过上面的示例,我们可以了解Java JVM程序指令码实例解析的过程,包括编译Java源代码、生成.class文件和反编译.class文件为JVM指令码。 在Java编程中,理解Java JVM程序指令码实例解析的过程非常重要,可以帮助...

    003 RJPOS:增加jvm的6个指令的实现

    我们将不涉及具体的压缩包内容,因为提供的信息中并未包含相关文件详情,但我们可以基于标题和描述来探讨JVM指令集的相关知识。 首先,JVM指令集是一系列预定义的、低级别的操作码,这些操作码是Java字节码的组成...

    JVM入门解析.pptx

    Java虚拟机(JVM)是Java程序运行的核心组件,它为Java代码提供了平台无关的运行环境。在JVM中,内存被划分为几个不同的区域,这些区域各自有不同的功能和生命周期,以便有效地管理和执行Java程序。 1. **虚拟机栈*...

    jvm解析编译过的class文件

    2. **验证**:接着,JVM会进行字节码验证,确保加载的类文件符合Java语言规范,没有潜在的安全问题,例如非法指令或类型不匹配。这是为了防止恶意代码破坏系统安全。 3. **准备**:在验证通过后,JVM为类的静态变量...

    JVM作用解析图.7z

    JVM 是可运行 Java 代码的假想计算机 ,包括一套字节码指令集、一组寄存器、一个栈、 一个垃圾回收,堆 和 一个存储方法域。JVM 是运行在操作系统之上的,它与硬件没有直接 的交互。

Global site tag (gtag.js) - Google Analytics