八、字节码中方法内部结构剖析

import java.util.Date;

public class LocalVariablesTest {
    private int count = 0;

    public static void main(String[] args) {
        LocalVariablesTest test = new LocalVariablesTest();
        int num = true;
        test.test1();
    }

    public static void testStatic() {
        new LocalVariablesTest();
        new Date();
        int count = 10;
        System.out.println(count);
    }

    public LocalVariablesTest() {
        this.count = 1;
    }

    public void test1() {
        Date date = new Date();
        String name1 = "atguigu.com";
        this.test2(date, name1);
        System.out.println(date + name1);
    }

    public String test2(Date dateP, String name2) {
        dateP = null;
        name2 = "songhongkang";
        double weight = 130.5D;
        char gender = true;
        return dateP + name2;
    }

    public void test3() {
        ++this.count;
    }

    public void test4() {
        int a = 0;
        int b = false;
        int c = a + 1;
        c = a + 1;
    }

    public void test5Temp() {
    }
}

javap -v LocalVariablesTest.class 查看字节码指令信息在这里插入图片描述
在这里插入图片描述

Classfile /E:/Users/lwb/IdeaProjects/jxm-server/target/classes/com/jxm/wxvideo/LocalVariablesTest.class
  Last modified 2023-2-27; size 1896 bytes
  MD5 checksum 7a927ee796938ab210219d381ba90759
  Compiled from "LocalVariablesTest.java"
public class com.jxm.wxvideo.LocalVariablesTest
  minor version: 0
  major version: 52
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
   #1 = Class              #60            // com/jxm/wxvideo/LocalVariablesTest
   #2 = Methodref          #1.#61         // com/jxm/wxvideo/LocalVariablesTest."<init>":()V
   #3 = Methodref          #1.#62         // com/jxm/wxvideo/LocalVariablesTest.test1:()V
   #4 = Class              #63            // java/util/Date
   #5 = Methodref          #4.#61         // java/util/Date."<init>":()V
   #6 = Fieldref           #64.#65        // java/lang/System.out:Ljava/io/PrintStream;
   #7 = Methodref          #66.#67        // java/io/PrintStream.println:(I)V
   #8 = Methodref          #21.#61        // java/lang/Object."<init>":()V
   #9 = Fieldref           #1.#68         // com/jxm/wxvideo/LocalVariablesTest.count:I
  #10 = String             #69            // atguigu.com
  #11 = Methodref          #1.#70         // com/jxm/wxvideo/LocalVariablesTest.test2:(Ljava/util/Date;Ljava/lang/String;)Ljava/lang/String;
  #12 = Class              #71            // java/lang/StringBuilder
  #13 = Methodref          #12.#61        // java/lang/StringBuilder."<init>":()V
  #14 = Methodref          #12.#72        // java/lang/StringBuilder.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder;
  #15 = Methodref          #12.#73        // java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
  #16 = Methodref          #12.#74        // java/lang/StringBuilder.toString:()Ljava/lang/String;
  #17 = Methodref          #66.#75        // java/io/PrintStream.println:(Ljava/lang/String;)V
  #18 = String             #76            // songhongkang
  #19 = Double             130.5d
  #21 = Class              #77            // java/lang/Object
  #22 = Utf8               count
  #23 = Utf8               I
  #24 = Utf8               main
  #25 = Utf8               ([Ljava/lang/String;)V
  #26 = Utf8               Code
  #27 = Utf8               LineNumberTable
  #28 = Utf8               LocalVariableTable
  #29 = Utf8               args
  #30 = Utf8               [Ljava/lang/String;
  #31 = Utf8               test
  #32 = Utf8               Lcom/jxm/wxvideo/LocalVariablesTest;
  #33 = Utf8               num
  #34 = Utf8               MethodParameters
  #35 = Utf8               testStatic
  #36 = Utf8               ()V
  #37 = Utf8               date
  #38 = Utf8               Ljava/util/Date;
  #39 = Utf8               <init>
  #40 = Utf8               this
  #41 = Utf8               test1
  #42 = Utf8               name1
  #43 = Utf8               Ljava/lang/String;
  #44 = Utf8               test2
  #45 = Utf8               (Ljava/util/Date;Ljava/lang/String;)Ljava/lang/String;
  #46 = Utf8               dateP
  #47 = Utf8               name2
  #48 = Utf8               weight
  #49 = Utf8               D
  #50 = Utf8               gender
  #51 = Utf8               C
  #52 = Utf8               test3
  #53 = Utf8               test4
  #54 = Utf8               b
  #55 = Utf8               a
  #56 = Utf8               c
  #57 = Utf8               test5Temp
  #58 = Utf8               SourceFile
  #59 = Utf8               LocalVariablesTest.java
  #60 = Utf8               com/jxm/wxvideo/LocalVariablesTest
  #61 = NameAndType        #39:#36        // "<init>":()V
  #62 = NameAndType        #41:#36        // test1:()V
  #63 = Utf8               java/util/Date
  #64 = Class              #78            // java/lang/System
  #65 = NameAndType        #79:#80        // out:Ljava/io/PrintStream;
  #66 = Class              #81            // java/io/PrintStream
  #67 = NameAndType        #82:#83        // println:(I)V
  #68 = NameAndType        #22:#23        // count:I
  #69 = Utf8               atguigu.com
  #70 = NameAndType        #44:#45        // test2:(Ljava/util/Date;Ljava/lang/String;)Ljava/lang/String;
  #71 = Utf8               java/lang/StringBuilder
  #72 = NameAndType        #84:#85        // append:(Ljava/lang/Object;)Ljava/lang/StringBuilder;
  #73 = NameAndType        #84:#86        // append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
  #74 = NameAndType        #87:#88        // toString:()Ljava/lang/String;
  #75 = NameAndType        #82:#89        // println:(Ljava/lang/String;)V
  #76 = Utf8               songhongkang
  #77 = Utf8               java/lang/Object
  #78 = Utf8               java/lang/System
  #79 = Utf8               out
  #80 = Utf8               Ljava/io/PrintStream;
  #81 = Utf8               java/io/PrintStream
  #82 = Utf8               println
  #83 = Utf8               (I)V
  #84 = Utf8               append
  #85 = Utf8               (Ljava/lang/Object;)Ljava/lang/StringBuilder;
  #86 = Utf8               (Ljava/lang/String;)Ljava/lang/StringBuilder;
  #87 = Utf8               toString
  #88 = Utf8               ()Ljava/lang/String;
  #89 = Utf8               (Ljava/lang/String;)V
{
  public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=2, locals=3, args_size=1
         0: new           #1                  // class com/jxm/wxvideo/LocalVariablesTest
         3: dup
         4: invokespecial #2                  // Method "<init>":()V
         7: astore_1
         8: bipush        10
        10: istore_2
        11: aload_1
        12: invokevirtual #3                  // Method test1:()V
        15: return
      LineNumberTable:
        line 8: 0
        line 9: 8
        line 10: 11
        line 11: 15
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0      16     0  args   [Ljava/lang/String;
            8       8     1  test   Lcom/jxm/wxvideo/LocalVariablesTest;
           11       5     2   num   I
    MethodParameters:
      Name                           Flags
      args

  public static void testStatic();
    descriptor: ()V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=2, locals=3, args_size=0
         0: new           #1                  // class com/jxm/wxvideo/LocalVariablesTest
         3: dup
         4: invokespecial #2                  // Method "<init>":()V
         7: astore_0
         8: new           #4                  // class java/util/Date
        11: dup
        12: invokespecial #5                  // Method java/util/Date."<init>":()V
        15: astore_1
        16: bipush        10
        18: istore_2
        19: getstatic     #6                  // Field java/lang/System.out:Ljava/io/PrintStream;
        22: iload_2
        23: invokevirtual #7                  // Method java/io/PrintStream.println:(I)V
        26: return
      LineNumberTable:
        line 15: 0
        line 16: 8
        line 17: 16
        line 18: 19
        line 21: 26
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            8      19     0  test   Lcom/jxm/wxvideo/LocalVariablesTest;
           16      11     1  date   Ljava/util/Date;
           19       8     2 count   I

  public com.jxm.wxvideo.LocalVariablesTest();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=1, args_size=1
         0: aload_0
         1: invokespecial #8                  // Method java/lang/Object."<init>":()V
         4: aload_0
         5: iconst_0
         6: putfield      #9                  // Field count:I
         9: aload_0
        10: iconst_1
        11: putfield      #9                  // Field count:I
        14: return
      LineNumberTable:
        line 24: 0
        line 5: 4
        line 25: 9
        line 26: 14
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0      15     0  this   Lcom/jxm/wxvideo/LocalVariablesTest;

  public void test1();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=3, locals=3, args_size=1
         0: new           #4                  // class java/util/Date
         3: dup
         4: invokespecial #5                  // Method java/util/Date."<init>":()V
         7: astore_1
         8: ldc           #10                 // String atguigu.com
        10: astore_2
        11: aload_0
        12: aload_1
        13: aload_2
        14: invokevirtual #11                 // Method test2:(Ljava/util/Date;Ljava/lang/String;)Ljava/lang/String;
        17: pop
        18: getstatic     #6                  // Field java/lang/System.out:Ljava/io/PrintStream;
        21: new           #12                 // class java/lang/StringBuilder
        24: dup
        25: invokespecial #13                 // Method java/lang/StringBuilder."<init>":()V
        28: aload_1
        29: invokevirtual #14                 // Method java/lang/StringBuilder.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder;
        32: aload_2
        33: invokevirtual #15                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
        36: invokevirtual #16                 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
        39: invokevirtual #17                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
        42: return
      LineNumberTable:
        line 29: 0
        line 30: 8
        line 31: 11
        line 32: 18
        line 33: 42
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0      43     0  this   Lcom/jxm/wxvideo/LocalVariablesTest;
            8      35     1  date   Ljava/util/Date;
           11      32     2 name1   Ljava/lang/String;

  public java.lang.String test2(java.util.Date, java.lang.String);
    descriptor: (Ljava/util/Date;Ljava/lang/String;)Ljava/lang/String;
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=6, args_size=3
         0: aconst_null
         1: astore_1
         2: ldc           #18                 // String songhongkang
         4: astore_2
         5: ldc2_w        #19                 // double 130.5d
         8: dstore_3
         9: sipush        30007
        12: istore        5
        14: new           #12                 // class java/lang/StringBuilder
        17: dup
        18: invokespecial #13                 // Method java/lang/StringBuilder."<init>":()V
        21: aload_1
        22: invokevirtual #14                 // Method java/lang/StringBuilder.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder;
        25: aload_2
        26: invokevirtual #15                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
        29: invokevirtual #16                 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
        32: areturn
      LineNumberTable:
        line 36: 0
        line 37: 2
        line 38: 5
        line 39: 9
        line 40: 14
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0      33     0  this   Lcom/jxm/wxvideo/LocalVariablesTest;
            0      33     1 dateP   Ljava/util/Date;
            0      33     2 name2   Ljava/lang/String;
            9      24     3 weight   D
           14      19     5 gender   C
    MethodParameters:
      Name                           Flags
      dateP
      name2

  public void test3();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=3, locals=1, args_size=1
         0: aload_0
         1: dup
         2: getfield      #9                  // Field count:I
         5: iconst_1
         6: iadd
         7: putfield      #9                  // Field count:I
        10: return
      LineNumberTable:
        line 44: 0
        line 45: 10
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0      11     0  this   Lcom/jxm/wxvideo/LocalVariablesTest;

  public void test4();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=3, args_size=1
         0: iconst_0
         1: istore_1
         2: iconst_0
         3: istore_2
         4: iload_1
         5: iconst_1
         6: iadd
         7: istore_2
         8: iload_1
         9: iconst_1
        10: iadd
        11: istore_2
        12: return
      LineNumberTable:
        line 48: 0
        line 50: 2
        line 51: 4
        line 54: 8
        line 55: 12
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            4       4     2     b   I
            0      13     0  this   Lcom/jxm/wxvideo/LocalVariablesTest;
            2      11     1     a   I
           12       1     2     c   I

  public void test5Temp();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=0, locals=2, args_size=1
         0: return
      LineNumberTable:
        line 67: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       1     0  this   Lcom/jxm/wxvideo/LocalVariablesTest;
}
SourceFile: "LocalVariablesTest.java"

IDEA使用jclasslib Bytecode Viewer 查看

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
局部变量
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值