java代码从初始化到具象执行

来源:互联网 发布:淘宝店办理营业执照 编辑:程序博客网 时间:2024/05/17 20:26

好吧,其实很多看代码的方法是书上没有的,看两位老大的讨论技术细节,我记下了方法。

方法

vim Test.java

public final class Test{        public static final String  s1 = "hello";        public static void main(String[] args){                System.out.println(s1);        }}

javac Test.java

javap -c -v Test.class

Classfile /Users/yeshen/Documents/yeshen/temp/Test.class  Last modified Aug 1, 2017; size 465 bytes  MD5 checksum 7f091d406dbf33427c3f71e331e14ca2  Compiled from "Test.java"public final class Test  minor version: 0  major version: 52  flags: ACC_PUBLIC, ACC_FINAL, ACC_SUPERConstant pool:   #1 = Methodref          #6.#18         // java/lang/Object."<init>":()V   #2 = Fieldref           #19.#20        // java/lang/System.out:Ljava/io/PrintStream;   #3 = Class              #21            // Test   #4 = String             #22            // hello   #5 = Methodref          #23.#24        // java/io/PrintStream.println:(Ljava/lang/String;)V   #6 = Class              #25            // java/lang/Object   #7 = Utf8               s1   #8 = Utf8               Ljava/lang/String;   #9 = Utf8               ConstantValue  #10 = Utf8               <init>  #11 = Utf8               ()V  #12 = Utf8               Code  #13 = Utf8               LineNumberTable  #14 = Utf8               main  #15 = Utf8               ([Ljava/lang/String;)V  #16 = Utf8               SourceFile  #17 = Utf8               Test.java  #18 = NameAndType        #10:#11        // "<init>":()V  #19 = Class              #26            // java/lang/System  #20 = NameAndType        #27:#28        // out:Ljava/io/PrintStream;  #21 = Utf8               Test  #22 = Utf8               hello  #23 = Class              #29            // java/io/PrintStream  #24 = NameAndType        #30:#31        // println:(Ljava/lang/String;)V  #25 = Utf8               java/lang/Object  #26 = Utf8               java/lang/System  #27 = Utf8               out  #28 = Utf8               Ljava/io/PrintStream;  #29 = Utf8               java/io/PrintStream  #30 = Utf8               println  #31 = Utf8               (Ljava/lang/String;)V{  public static final java.lang.String s1;    descriptor: Ljava/lang/String;    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL    ConstantValue: String hello  public Test();    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                  // Field java/lang/System.out:Ljava/io/PrintStream;         3: ldc           #4                  // String hello         5: invokevirtual #5                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V         8: return      LineNumberTable:        line 4: 0        line 5: 8}SourceFile: "Test.java"

run

java Test

结论:

这样弄了之后,代码从初始化到具象执行的过程都透明可见了。