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匯編中沒有對應類別;
總結
以上是生活随笔為你收集整理的Java虚拟机new和newarray相关指令学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring Boot CLI 入门项目
- 下一篇: 初步了解超图两种3D客户端 - iCli