先定义一个方法 public class Main { publicstatic double getNumber() { returnMath.random()/2; } } 反编译 Constant pool: #1 = Methodref #6.#15 //java/lang/Object."<init>":()V #2 = Methodref #16.#17 //java/lang/Math.random:()D #3 = Double 2.0d #5 = Class #18 // Main #6 = Class #19 // java/lang/Object #7 = Utf8 <init> #8 = Utf8 ()V #9 = Utf8 Code #10 = Utf8 LineNumberTable #11 = Utf8 getNumber #12 = Utf8 ()D #13 = Utf8 SourceFile #14 = Utf8 Main.java #15 = NameAndType #7:#8 //"<init>":()V #16 = Class #20 // java/lang/Math #17 = NameAndType #21:#12 // random:()D #18 = Utf8 Main #19 = Utf8 java/lang/Object #20 = Utf8 java/lang/Math #21 = Utf8 random { 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 double getNumber(); descriptor: ()D flags: ACC_PUBLIC, ACC_STATIC Code: stack=4, locals=0, args_size=0 0: invokestatic #2 // Method java/lang/Math.random:()D 3: ldc2_w #3 // double 2.0d 6: ddiv 7: dreturn LineNumberTable: line 3: 0 } SourceFile: "Main.java" invokestatic #2 调用常量#2定义的函数 也就是说调用了这个方法得到了一个随机数 函数名定义再常量池Methodref中 定义 类 方法 返回 2 = Methodref #16.#17 //java/lang/Math.random:()D 也就是说 #2 是#16#17 拼接成的 #16定义了类名Method java/lang/Math #17定义了方法 random返回类型()D #17 = NameAndType #21:#12 // random:()D 也就是说 #17 是#21#12 拼接成的 #21 定义了random 方法 #12 返回类型()D ()括号内没有东西表示没参数 public class Main { public staticvoid main(String[] args) { System.out.println("Lightcolour"); } } 反编译 Lastmodified 2019-9-20; size 413 bytes MD5checksum 8e45b6aafc1404a9c015f8c0f03e385c Compiled from "Main.java" public class Main minorversion: 0 majorversion: 52 flags: ACC_PUBLIC, ACC_SUPER Constant pool: #1 =Methodref #6.#15 //java/lang/Object."<init>":()V #2 =Fieldref #16.#17 //java/lang/System.out:Ljava/io/PrintStream; #3 =String #18 // Lightcolour #4 =Methodref #19.#20 //java/io/PrintStream.println:(Ljava/lang/String;)V #5 =Class #21 // Main #6 =Class #22 // java/lang/Object #7 =Utf8 <init> #8 =Utf8 ()V #9 =Utf8 Code #10 =Utf8 LineNumberTable #11 =Utf8 main #12 =Utf8 ([Ljava/lang/String;)V #13 =Utf8 SourceFile #14 =Utf8 Main.java #15 =NameAndType #7:#8 // "<init>":()V #16 =Class #23 // java/lang/System #17 =NameAndType #24:#25 // out:Ljava/io/PrintStream; #18 =Utf8 Lightcolour #19 =Class #26 // java/io/PrintStream #20 =NameAndType #27:#28 // println:(Ljava/lang/String;)V #21 =Utf8 Main #22 =Utf8 java/lang/Object #23 =Utf8 java/lang/System #24 =Utf8 out #25 =Utf8 Ljava/io/PrintStream; #26 =Utf8 java/io/PrintStream #27 =Utf8 println #28 =Utf8 (Ljava/lang/String;)V { public Main(); descriptor: ()V flags: ACC_PUBLIC Code: stack=1, locals=1, args_size=1 0: aload_0 1: invokespecial #1 // Method java/lang/Object."<init>":()V 4: return LineNumberTable: line 1: 0 public static void main(java.lang.String[]); descriptor: ([Ljava/lang/String;)V flags: ACC_PUBLIC, ACC_STATIC Code: stack=2, locals=1, args_size=1 0: getstatic #2 // Fieldjava/lang/System.out:Ljava/io/PrintStream; 3: ldc #3 // String Lightcolour 5: invokevirtual #4 // Methodjava/io/PrintStream.println:(Ljava/lang/String;)V 8: return LineNumberTable: line 3: 0 line 4: 8 } getstatic #2获取System.out的引用入栈 ldc将字符串“Lightcolour” 入栈 invokevirtual 调用println方法 这里会进行2个操作 1、将字符串Lightcolour出栈传入(Ljava/lang/String;)V 2、将System.out 出栈传入java/io/PrintStream.println 再看beep方法 public class Main { public staticvoid main(String[] args) { java.awt.Toolkit.getDefaultToolkit().beep(); } } 反编译 Lastmodified 2019-9-20; size 355 bytes MD5checksum 7c26b26edfdde5f4bb8410a0f05bc289 Compiled from "Main.java" public class Main minorversion: 0 majorversion: 52 flags: ACC_PUBLIC, ACC_SUPER Constant pool: #1 =Methodref #5.#14 //java/lang/Object."<init>":()V #2 =Methodref #15.#16 //java/awt/Toolkit.getDefaultToolkit:()Ljava/awt/Toolkit; #3 =Methodref #15.#17 // java/awt/Toolkit.beep:()V #4 =Class #18 // Main #5 =Class #19 // java/lang/Object #6 =Utf8 <init> #7 =Utf8 ()V #8 =Utf8 Code #9 =Utf8 LineNumberTable #10 =Utf8 main #11 =Utf8 ([Ljava/lang/String;)V #12 =Utf8 SourceFile #13 =Utf8 Main.java #14 =NameAndType #6:#7 // "<init>":()V #15 =Class #20 // java/awt/Toolkit #16 =NameAndType #21:#22 //getDefaultToolkit:()Ljava/awt/Toolkit; #17 =NameAndType #23:#7 // beep:()V #18 =Utf8 Main #19 =Utf8 java/lang/Object #20 =Utf8 java/awt/Toolkit #21 =Utf8 getDefaultToolkit #22 =Utf8 ()Ljava/awt/Toolkit; #23 =Utf8 beep { public Main(); descriptor: ()V flags:ACC_PUBLIC Code: stack=1, locals=1, args_size=1 0: aload_0 1: invokespecial #1 //Method java/lang/Object."<init>":()V 4: return LineNumberTable: line 1: 0 public static void main(java.lang.String[]); descriptor: ([Ljava/lang/String;)V flags: ACC_PUBLIC, ACC_STATIC Code: stack=1, locals=1, args_size=1 0: invokestatic #2// Methodjava/awt/Toolkit.getDefaultToolkit:()Ljava/awt/Toolkit; 3: invokevirtual #3 // Methodjava/awt/Toolkit.beep:()V 6: return LineNumberTable: line 3: 0 line 4: 6 } invokestatic #2 调用java.awt.Toolkit.getDefaultToolkit()方法 invokevirtual #3 调用beep()函数
本机资源word文档
|