小编典典

用Java在哪里存储捕获的变量?

java

我试图理解Java中捕获变量的概念。

我发现了有关它的详细文章: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的空间中?


阅读 231

收藏
2020-11-26

共1个答案

小编典典

作者似乎是指将捕获的变量转换为本地/匿名类的字段这一事实。

如果您不满意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,第二个字段是对封闭实例的引用。此外,这些值被隐式传递到本地类的构造函数中。

本质上LocalClass看起来像这样:

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
    }
}
2020-11-26