本帖最后由 Lightcolour 于 2019-9-20 01:30 编辑
Java中最简单的“方法”(java中不存在函数function)也就是返回一值比如public String getName() {return “Lightcolour”;} 这个方法返回了一个String 也就是字符串 “Lightcolour” 常量入栈指令有iconst、bipush、sipush、ldc、ldc2_w
在一个主类(class)中的方法 public class Main { publicstatic int main () { return 0; } } 这个方法会返回一个值 int型 整数型 4字节 返回值为 0 我们在记事本上写一个这样的java文件:javac Main.java 使用java的标准反编译工具javap -c -verbose Main.class Last modified 2019-9-20; size 235 bytes MD5 checksum 29925e418a0454c00c9ecfeac55db6b4 Compiled from "Main.java" public class Main minor version: 0 major version: 52 flags: ACC_PUBLIC, ACC_SUPER Constant pool: #1 = Methodref #3.#12 //java/lang/Object."<init>":()V #2 = Class #13 // Main #3 = Class #14 // java/lang/Object #4 = Utf8 <init> #5 = Utf8 ()V #6 = Utf8 Code #7 = Utf8 LineNumberTable #8 = Utf8 main #9 = Utf8 ()I #10 = Utf8 SourceFile #11 = Utf8 Main.java #12 = NameAndType #4:#5 //"<init>":()V #13 = Utf8 Main #14 = Utf8 java/lang/Object { public Main(); descriptor: ()V flags: ACC_PUBLIC Code: stack=1, locals=1, args_size=1 0: aload_0 1: invokespecial #1 // Methodjava/lang/Object."<init>":()V 4: return LineNumberTable: line 1: 0 public static int main(); descriptor: ()I flags: ACC_PUBLIC, ACC_STATIC Code: stack=1, locals=0, args_size=0 0: iconst_0 1: ireturn LineNumberTable: line 3: 0 } SourceFile: "Main.java" 在程序中最常见的就是0因为区分短一个短字节的 iconst_0也是0的入栈ireturn指令 i 就是 integer
我们接着返回一个 int 为 123
public class Main { publicstatic int main () { return 123; } } 编译然后反编译 Code: stack=1, locals=0, args_size=0 0: bipush 123 2: ireturn 那么为什么这次变成了bipush 而不是 iconst_0了呢 那就是int 的范围 当 int 的范围 在 0 ~ 5的时候 指令是 iconst_0 ~ iconst_5 -1 是iconst_m1 在 -128 ~ 127 的时候 指令是 bipush 在 -32768 ~ 32767 的时候 指令是sipush 我们接着返回 1234 试试 编译然后反编译 Code: stack=1, locals=0, args_size=0 0: sipush 1234 3: ireturn LineNumberTable: line 3: 0 看到一定范围的时候指令就会变就会变 我列了一张表 各变量当在一定范围的时候指令的变化 我们接着看看其他反编译的 boolean false iconst_0 boolean true iconst_1 也就是说 false 用常量 0 表示 true 用常量 1表示 short 1234 sipush char ‘A’ bipuch 65 char ‘啊’ sipush 21834 注意这里记事本保存为ANSI byte 123 bipuch long 12345678901234567891 0: ldc2_w #2 double 123.456d ldc2_w #2 float 123.456f ldc #2
本集资源
|