乐趣区

关于java:我所知道JVM虚拟机之字节码指令集与解析四对象创建与访问指令

一、对象创立与拜访指令的概述


Java 是面向对象的程序设计语言,虚拟机平台从字节码层面就对面向对象做了深层次的反对。有一系列指令专门用于对象操作,可进一步细分为 创立指令、字段拜访批令、数组操作指令、类型查看指令

二、创立指令


尽管类实例和数组都是对象,但 ava 虚拟机对类实例和数组的创立与操作应用了不同的字节码指令:

创立类实例的指令:
  • 创立类实例的指令: new
  • 它接管一个操作数为指向 Q 量池的索引,示意要创立的类型,执行实现后,将对象的援用压入栈
创立数组的指令:
  • 创立数组的指令: newarray、anewarray、multianewarrayc
  • newarray: 创立根本类型数组
  • anewarray: 创立援用类型数组
  • multianewarray: 创立多维数组

上述创立指令能够用于创建对象或者数组

并且因为对象和数组在 Java 中的宽泛应用,这些指令的应用频率也十分高

接下来咱们针对于创立类的指令的根本测试,请看以下示例代码

public class NewTest{
     //1. 创立指令
    public void newInstance(){Object obj = new Object();
        File file = new File("atguigu.avi");
    }
}

接下来咱们编译该代码,看看办法的字节码是用什么指令进行对象创立的?

接下来咱们依据字节码指令进行图示解析剖析,具体做了哪些操作?




接下来咱们针对于创立类的指令的根本测试,请看以下示例代码

public class NewTest{public void newArray() i
        int[] intArray = new int[10];
        Object[] objArray = new Object[10];
        int[][]mintArray = new int[10][10];
        String[][] strArray = new String[10][];}
}

接下来咱们编译该代码,看看办法的字节码是用什么指令进行对象创立的?

三、字段拜访指令


对象创立后,就能够通过对象拜访指令获取对象实例或数组实例中的字段或者数组元素。

  • 拜访类字段(static 字段,或者称为类变量)的指令: getstatic、putstatic
  • 拜访类实例字段(非 static 字段,或者称为实例变量)的指令: getfield、putfield

以 getstatic 指令为例它含有一个操作数,为指向常量池的 Fieldref 索引。

它的作用就是获取 Fieldref 指定的对象或者值,并将其压入操作数栈。

接下来咱们针对于字段拜访的指令的根本测试,请看以下示例代码

public class NewTest{
     
    //2. 字段拜访指令
    public void sayHello(){system.out.print1n("hello");
    }
}

接下来咱们编译该代码,看看办法的字节码是用什么指令的?




接下来咱们联合后面的创建对象指令与字段拜访指令,看看又是怎么样的成果?

public class NewTest{public void setorderId(){order order = new Order();
        order.id = 1001;
        System.out.println(order.id);
    I
        order.name = "ORDER";
        System.out.println(order.name);
    }
}

class order{
    int id;
    static string name;
}

接下来咱们编译该代码,看看办法的字节码是用什么指令的?

接下来咱们依据字节码指令进行图示解析剖析,具体做了哪些操作?




四、数组操作指令


数组操作指令次要有: xastore 和 xaload 指令。具体为:

把一个数组元素加载到操作数栈的指令:

baload、caload、saload、iaload、laload、faload、daload、aaload

将一个操作数栈的值存储到数组元素中的指令:

bastore、castore、sastore、iastore、lastore、fastore、dastore、aastore

取数组长度的指令:arraylength

该指令弹出栈顶的数组元素,获取数组的长度,将长度压入栈。

指令 xaload 示意将数组的元素压栈,比方 saload、caload 别离示意压入 short 数组和 char 数组

指令 xaload 在执行时要求操作数中栈顶元素为数组索引 i,栈顶顺位第 2 个元素为数组援用 a,该指令会弹出栈顶这两个元素,并将 a[i]从新压入堆栈。

xastore 则专门针对数组操作,以 iastore 为例,它用于给一个 int 数组的给定索引赋值。

在 iastore 执行前操作数栈顶须要以此筹备 3 个元素:值、索引、数组援用

iastore 会弹出这 3 个值,并将值赋给数组中指定索引的地位。

接下来咱们针对于数组操作指令的根本测试,请看以下示例代码

public class NewTest{
     
    //3. 数组操作指令
    public void setArray(){int[] intArray = new int[10];
        intArray[3] = 20;
        System.out.println(intArray[1]);
    }
}

接下来咱们编译该代码,看看办法的字节码是用什么指令的?



接下来咱们再针对于数组操作指令的根本测试,请看以下示例代码

public class NewTest{
     
    / /3. 数组操作指令
    public void setArray(){int[] intArray = new int[10];
        intArray[3] = 20;
        System.out.println(intArray[1]);
        
        boolean[] arr = new boolean[10];
        arr[1] = true;
    }
}

接下来咱们编译该代码,看看办法的字节码是用什么指令的?

接下来咱们再针对于数组操作指令的根本测试,请看以下示例代码

public class NewTest{public void arrLength(){double[] arr = new double[10];
        system.out.println(arr.length);
    }
}

接下来咱们编译该代码,看看办法的字节码是用什么指令的?

五、类型查找指令


查看类实例或数组类型的指令: instanceof、checkcast

指令 checkcast 用于查看类型强制转换是否能够进行

如果能够进行那么 checkcast 指令不会扭转操作数栈,否则它会抛出 C1asscastException 异样。

指令 instanceof 用来判断给定对象是否是某一个类的实例,它会将判断后果压入操作数栈。

接下来咱们针对于类型查找指令的根本测试,请看以下示例代码

public class NewTest{
     
    //4. 类型查看指令
    public String checkcast(Object obj){if (obj instanceof String) {return (String)obj;
        }else{return null;}
    }
}

接下来咱们编译该代码,看看办法的字节码是用什么指令的?


退出移动版