gpt4 book ai didi

java - Java中捕获的变量存储在哪里?

转载 作者:行者123 更新时间:2023-12-02 06:26:35 24 4
gpt4 key购买 nike

我正在尝试理解 Java 中捕获变量的概念。

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

我不确定字节码部分:

Similarly, for accessing local variables of an enclosing method, a hidden copy of the variable is made and kept in the inner class file from where it accesses the variable.

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

例如:

void foo(int x){
final int y = 10 + x;

class LocalClass(){
LocalClass(){
System.out.println(y); // works fine
}
}
}

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

最佳答案

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

如果你反汇编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
}
}

关于java - Java中捕获的变量存储在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55781729/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com