设计工业,wordpress网站前端优化,艾艺公司团队定制,西安私人网站问题背景
安卓开发过程中#xff0c;经常要通过看一些java代码对应的字节码#xff0c;来了解java代码编译后的运行机制#xff0c;本文将通过一个简单的demo介绍一些基本的字节码指令。
问题分析
比如以下代码#xff1a;
public class test {public static void main…问题背景
安卓开发过程中经常要通过看一些java代码对应的字节码来了解java代码编译后的运行机制本文将通过一个简单的demo介绍一些基本的字节码指令。
问题分析
比如以下代码
public class test {public static void main(String[] args) {int a 100;int b 100;int c 100;a b c;System.out.println(a);}
}运行结果如下
a b c a (b c)查看对应的字节码文件如下
// class version 52.0 (52)
// access flags 0x21
public class test {// compiled from: test.java// access flags 0x1public init()VL0LINENUMBER 1 L0ALOAD 0INVOKESPECIAL java/lang/Object.init ()VRETURNL1LOCALVARIABLE this Ltest; L0 L1 0MAXSTACK 1MAXLOCALS 1// access flags 0x9public static main([Ljava/lang/String;)VL0LINENUMBER 3 L0BIPUSH 100ISTORE 1 // 将100存储到局部变量L1LINENUMBER 4 L1BIPUSH 100ISTORE 2 // 将100存储到局部变量L2LINENUMBER 5 L2BIPUSH 100ISTORE 3 // 将100存储到局部变量L3LINENUMBER 6 L3ILOAD 1 // 从局部变量表中加载 int 类型到操作数栈ILOAD 2 // 从局部变量表中加载 int 类型到操作数栈ILOAD 3 // 从局部变量表中加载 int 类型到操作数栈IADD // 将栈顶两个 int 类型数值相加IADD // 将栈顶两个 int 类型数值相加ISTORE 1 // 将 int 类型存储到局部变量中,这里就是把结果存储到第一个变量L4LINENUMBER 7 L4GETSTATIC java/lang/System.out : Ljava/io/PrintStream;ILOAD 1INVOKEVIRTUAL java/io/PrintStream.println (I)VL5LINENUMBER 8 L5RETURNL6LOCALVARIABLE args [Ljava/lang/String; L0 L6 0LOCALVARIABLE a I L1 L6 1LOCALVARIABLE b I L2 L6 2LOCALVARIABLE c I L3 L6 3MAXSTACK 3MAXLOCALS 4
}问题总结
通过查看java代码对应的字节码可以比较清楚的看到java代码编译后的执行流程。在安卓开发中了解字节码知识还是非常有必要的在关键时刻我们查看字节码能够很好的解答一些疑惑下面是常见的一些字节码指令
1. 加载和存储指令aload从局部变量表中加载引用类型到操作数栈。astore将引用类型存储到局部变量表中。iload从局部变量表中加载 int 类型到操作数栈。istore将 int 类型存储到局部变量表中。fload从局部变量表中加载 float 类型到操作数栈。fstore将 float 类型存储到局部变量表中。2. 算术和逻辑指令iadd将栈顶两个 int 类型数值相加。isub将栈顶两个 int 类型数值相减。imul将栈顶两个 int 类型数值相乘。idiv将栈顶两个 int 类型数值相除。iand将栈顶两个 int 类型数值进行按位与操作。ior将栈顶两个 int 类型数值进行按位或操作。3. 类型转换指令i2l将 int 类型转换为 long 类型。l2i将 long 类型转换为 int 类型。f2d将 float 类型转换为 double 类型。d2i将 double 类型转换为 int 类型。4. 控制流指令if_icmpeq如果两个 int 类型数值相等则跳转到指定位置。goto无条件跳转到指定位置。tableswitch根据索引值跳转到不同位置的指令。5. 方法调用和返回指令invokevirtual调用实例方法。invokestatic调用静态方法。invokeinterface调用接口方法。ireturn从方法中返回 int 类型值。invokedynamic: 运行时动态解析并绑定方法调用持续更新有兴趣的小伙伴可以进一步深入研究。