请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

我查看了字节码、class 文件,咋觉得我的代码和你的不太一样鸭

// Outer.java
public class Outer {

    public abstract class Inner {
        abstract void test();
    }
}
// Client.java
public class Client {

    private final Object obj = new Object();

    public void run() {
        Outer.Inner inner = new Outer().new Inner() {
            @Override
            void test() {
                System.out.println(obj.toString());
            }
        };
    }
}

这里是 build/classes/java/main/Client.class 里的代码:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

import Outer.Inner;

public class Client {
    private final Object obj = new Object();

    public Client() {
    }

    public void run() {
        Outer var10003 = new Outer();
        var10003.getClass();
        Inner var10000 = new Inner(var10003) {
            {
                x0.getClass();
            }

            void test() {
                System.out.println(Client.this.obj.toString());
            }
        };
    }
}

这里是 Client.class 对应的字节码:

// class version 52.0 (52)
// access flags 0x21
public class Client {

  // compiled from: Client.java
  // access flags 0x0
  INNERCLASS Client$1 null null
  // access flags 0x401
  public abstract INNERCLASS Outer$Inner Outer Inner

  // access flags 0x12
  private final Ljava/lang/Object; obj

  // access flags 0x1
  public <init>()V
   L0
    LINENUMBER 1 L0
    ALOAD 0
    INVOKESPECIAL java/lang/Object.<init> ()V
   L1
    LINENUMBER 3 L1
    ALOAD 0
    NEW java/lang/Object
    DUP
    INVOKESPECIAL java/lang/Object.<init> ()V
    PUTFIELD Client.obj : Ljava/lang/Object;
    RETURN
   L2
    LOCALVARIABLE this LClient; L0 L2 0
    MAXSTACK = 3
    MAXLOCALS = 1

  // access flags 0x1
  public run()V
   L0
    LINENUMBER 6 L0
    NEW Client$1
    DUP
    ALOAD 0
    NEW Outer
    DUP
    INVOKESPECIAL Outer.<init> ()V
    DUP
    INVOKEVIRTUAL java/lang/Object.getClass ()Ljava/lang/Class;
    POP
    INVOKESPECIAL Client$1.<init> (LClient;LOuter;)V
    ASTORE 1
   L1
    LINENUMBER 12 L1
    RETURN
   L2
    LOCALVARIABLE this LClient; L0 L2 0
    LOCALVARIABLE inner LOuter$Inner; L1 L2 1
    MAXSTACK = 5
    MAXLOCALS = 2

  // access flags 0x1008
  static synthetic access$000(LClient;)Ljava/lang/Object;
   L0
    LINENUMBER 1 L0
    ALOAD 0
    GETFIELD Client.obj : Ljava/lang/Object;
    ARETURN
   L1
    LOCALVARIABLE x0 LClient; L0 L1 0
    MAXSTACK = 1
    MAXLOCALS = 1
}

最后是老师视频里的代码截图:
图片描述

我的疑惑是,似乎我并没有在字节码或者 Client.class 文件里看到和 Client$1 一样的代码?

正在回答 回答被采纳积分+3

1回答

bennyhuo 2020-05-13 06:30:12

同学具体对哪里有疑问?

0 回复 有任何疑惑可以回复我~
  • 提问者 HelloVass #1
    老师,我重新修改了问题,你再看看。就是,我看了字节码和class代码,发现和你的这个 Client$1 长得不太一样
    回复 有任何疑惑可以回复我~ 2020-05-13 08:09:55
  • bennyhuo 回复 提问者 HelloVass #2
    哦哈这个是正常的哈,同学可以试试在test方法中引用一下外部的类成员,就能看到啦
    回复 有任何疑惑可以回复我~ 2020-05-13 09:36:22
  • 提问者 HelloVass 回复 bennyhuo #3
    emm,我尝试过了,也没看到老师这边 Client$1 的代码,不知道这个文件是如何生成的?
    回复 有任何疑惑可以回复我~ 2020-05-13 14:26:42
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信