从字节码执行解释方法的动态绑定

class Person{
    String name = "Person";
}
class Child extends Person {
    String name = "Child";
}


public class duo {
    public static void main(String[] args){
        Person p = new Child();
        Child c = new Child();
        p.name = "zhangsan";
        System.out.println(p.name);
        System.out.println(c.name);
    }
}

代码输出:

 字节码解释执行之后的

F:\Java\Java_project\huawei\out\production\huawei>javap -v duo.class
Classfile /F:/Java/Java_project/huawei/out/production/huawei/duo.class
  Last modified 2022-7-14; size 679 bytes
  MD5 checksum 2068d0897329f87d88f8eff1d7149ff1
  Compiled from "duo.java"
public class duo
  minor version: 0
  major version: 52
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
   #1 = Methodref          #10.#28        // java/lang/Object."<init>":()V
   #2 = Class              #29            // Child
   #3 = Methodref          #2.#28         // Child."<init>":()V
   #4 = String             #30            // zhangsan
   #5 = Fieldref           #31.#32        // Person.name:Ljava/lang/String;
   #6 = Fieldref           #33.#34        // java/lang/System.out:Ljava/io/PrintStream;
   #7 = Methodref          #35.#36        // java/io/PrintStream.println:(Ljava/lang/String;)V
   #8 = Fieldref           #2.#32         // Child.name:Ljava/lang/String;
   #9 = Class              #37            // duo
  #10 = Class              #38            // java/lang/Object
  #11 = Utf8               <init>
  #12 = Utf8               ()V
  #13 = Utf8               Code
  #14 = Utf8               LineNumberTable
  #15 = Utf8               LocalVariableTable
  #16 = Utf8               this
  #17 = Utf8               Lduo;
  #18 = Utf8               main
  #19 = Utf8               ([Ljava/lang/String;)V
  #20 = Utf8               args
  #21 = Utf8               [Ljava/lang/String;
  #22 = Utf8               p
  #23 = Utf8               LPerson;
  #24 = Utf8               c
  #25 = Utf8               LChild;
  #26 = Utf8               SourceFile
  #27 = Utf8               duo.java
  #28 = NameAndType        #11:#12        // "<init>":()V
  #29 = Utf8               Child
  #30 = Utf8               zhangsan
  #31 = Class              #39            // Person
  #32 = NameAndType        #40:#41        // name:Ljava/lang/String;
  #33 = Class              #42            // java/lang/System
  #34 = NameAndType        #43:#44        // out:Ljava/io/PrintStream;
  #35 = Class              #45            // java/io/PrintStream
  #36 = NameAndType        #46:#47        // println:(Ljava/lang/String;)V
  #37 = Utf8               duo
  #38 = Utf8               java/lang/Object
  #39 = Utf8               Person
  #40 = Utf8               name
  #41 = Utf8               Ljava/lang/String;
  #42 = Utf8               java/lang/System
  #43 = Utf8               out
  #44 = Utf8               Ljava/io/PrintStream;
  #45 = Utf8               java/io/PrintStream
  #46 = Utf8               println
  #47 = Utf8               (Ljava/lang/String;)V
{
  public duo();
    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 9: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       5     0  this   Lduo;

  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           #2                  // class Child
         3: dup
         4: invokespecial #3                  // Method Child."<init>":()V
         7: astore_1
         8: new           #2                  // class Child
        11: dup
        12: invokespecial #3                  // Method Child."<init>":()V
        15: astore_2
        16: aload_1
        17: ldc           #4                  // String zhangsan
        19: putfield      #5                  // Field Person.name:Ljava/lang/String;
        22: getstatic     #6                  // Field java/lang/System.out:Ljava/io/PrintStream;
        25: aload_1
        26: getfield      #5                  // Field Person.name:Ljava/lang/String;
        29: invokevirtual #7                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
        32: getstatic     #6                  // Field java/lang/System.out:Ljava/io/PrintStream;
        35: aload_2
        36: getfield      #8                  // Field Child.name:Ljava/lang/String;
        39: invokevirtual #7                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
        42: return
      LineNumberTable:
        line 11: 0
        line 12: 8
        line 13: 16
        line 14: 22
        line 15: 32
        line 16: 42
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0      43     0  args   [Ljava/lang/String;
            8      35     1     p   LPerson;
           16      27     2     c   LChild;
}
SourceFile: "duo.java"

划重点:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值