代码之家  ›  专栏  ›  技术社区  ›  TiyebM

actionListener如何存储此参数?[副本]

  •  0
  • TiyebM  · 技术社区  · 7 年前

    我找到了一篇非常详细的文章: http://www.devcodenote.com/2015/04/variable-capture-in-java.html

    我不确定字节码部分:

    类似地,为了访问封闭方法的局部变量,将创建变量的隐藏副本并将其保存在内部类中 文件 它从哪里访问变量。

    当编译时可能不知道最终的原语值时,如何将其保存到类文件中(编译期间)?

    void foo(int x){
        final int y = 10 + x;
    
        class LocalClass(){
            LocalClass(){
                System.out.println(y);  // works fine
            }
        }
    }
    

    若作者错了,运行时是否将局部变量复制到方法区域中LocalClass的空间中?

    0 回复  |  直到 9 年前
        1
  •  6
  •   Jorn Vernee    9 年前

    作者似乎指的是这样一个事实:捕获的变量被转换成本地/匿名类的字段。

    如果你拆了 LocalClass Main 是封闭类的名称):

    class Main$1LocalClass {
      final int val$y;
    
      final Main this$0;
    
      Main$1LocalClass();
        Code:
           0: aload_0
           1: aload_1
           2: putfield      #1                  // Field this$0:LMain;
           5: aload_0
           6: iload_2
           7: putfield      #2                  // Field val$y:I
          10: aload_0
          11: invokespecial #3                  // Method java/lang/Object."<init>":()V
          14: getstatic     #4                  // Field java/lang/System.out:Ljava/io/PrintStream;
          17: aload_0
          18: getfield      #2                  // Field val$y:I
          21: invokevirtual #5                  // Method java/io/PrintStream.println:(I)V
          24: return
    }
    

    第一个字段是局部变量 y ,第二个字段是对封闭实例的引用。此外,这些值被隐式地传递到本地类的构造函数中。

    本地类 看起来像这样:

    class LocalClass {
        final int val$y;
        final Main this$0;
    
        LocalClass(Main arg1, int arg2) {
            this.this$0 = arg1; // bytecode 1-2
            this.val$y = arg2; // bytecode 5-7
            super(); // bytecode 10-11
            System.out.println(this.val$y); // bytecode 14-21
        }
    }