Java虚拟机new和newarray相关指令学习

先做一个简单程序;

import java.io.*;
 
class Employee{
   String name;
   int age;
   String designation;
   double salary;

   public Employee(String name){
      this.name = name;
   }

   public void empAge(int empAge){
      age =  empAge;
   }

   public void empDesignation(String empDesig){
      designation = empDesig;
   }

   public void empSalary(double empSalary){
      salary = empSalary;
   }

   public void printEmployee(){
      System.out.println("名字:"+ name );
      System.out.println("年龄:" + age );
      System.out.println("职位:" + designation );
      System.out.println("薪水:" + salary);
   }
}

public class EmployeeTest{
 
   public static void main(String[] args){
      Employee empOne = new Employee("RUNOOB1");
      Employee empTwo = new Employee("RUNOOB2");
 
      empOne.empAge(26);
      empOne.empDesignation("高级工程师");
      empOne.empSalary(1000);
      empOne.printEmployee();
 
      empTwo.empAge(21);
      empTwo.empDesignation("中级工程师");
      empTwo.empSalary(500);
      empTwo.printEmployee();
   }
}

构建;同一个文件中有多个java类,只能有一个是public,其他类要把public去掉;

然后反汇编;如下; 

看一下反汇编后的指令;

main里面,第0和第10行,是new指令;

new指令的用途是创建类实例;

然后还包含多条invokevirtual指令;invokevirtual 指令用于调用对象的实例方法;


java虚拟机中有一类指令是 方法调用和返回指令;其说明如下;

invokevirtual 指令用于调用对象的实例方法,根据对象的实际类型进行分派(虚方法分派),这也是Java语言中最常见的方法分派方式。
invokeinterface 指令用于调用接口方法,它会在运行时搜索一个实现了这个接口方法的对象,找出适合的方法进行调用。
invokespecial 指令用于调用一些需要特殊处理的实例方法,包括实例初始化(<init>)方法、私有方法和父类方法。
invokestatic  调用静态方法(static方法)。
invokedynamic 指令用于在运行时动态解析出调用点限定符所引用的方法,并执行该方法,前面4条调用指令的分派逻辑都固化在Java虚拟机内部,而invokedynamic指令的分派逻辑是由用户所设定的引导方法决定的。

 

再做一个程序;

public class TestArray {
   public static void main(String[] args) {

      int size = 10;

      double[] myList = new double[size];
      myList[0] = 5.6;
      myList[1] = 4.5;
      myList[2] = 3.3;
      myList[3] = 13.2;
      myList[4] = 4.0;
      myList[5] = 34.33;
      myList[6] = 34.0;
      myList[7] = 45.45;
      myList[8] = 99.993;
      myList[9] = 11123;

      double total = 0;
      for (int i = 0; i < size; i++) {
         total += myList[i];
      }
      System.out.println("总和为: " + total);
   }
}

构建,并反汇编;如下;

 

看一下指令里面包含 newarray;

newarray是创建数组的指令;

然后还有 dastore 指令;dastore是 将一个操作数栈的值存储到数组元素中的指令;

86行,daload,这是把一个数组元素加载到操作数栈;

相关这一类的Java虚拟机指令,其说明如下;

创建数组的指令:newarray、anewarray、multianewarray。
访问类字段(static字段,或者称为类变量)和实例字段(非static字段,或者称为实例变量)的指令:getfield、putfield、getstatic、putstatic。
把一个数组元素加载到操作数栈的指令:baload、caload、saload、iaload、laload、faload、daload、aaload。
将一个操作数栈的值存储到数组元素中的指令:bastore、castore、sastore、iastore、fastore、dastore、aastore。
取数组长度的指令:arraylength。
检查类实例类型的指令:instanceof、checkcast。

 

虚拟机指令应该算是类汇编的指令;但是和x86汇编有很大的不同;其包含的new和newarray这一类型指令在x86汇编中没有对应类别;

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值