我试图理解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的空间中?
作者似乎是指将捕获的变量转换为本地/匿名类的字段这一事实。
如果您不满意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
}
}
问题内容: 被存储在客户端或服务器上的变量? 问题答案: 变量存储的位置由PHP的配置确定。通常这是在Linux / Unix系统上。如果无法100%确定,请使用此功能查看您的特定设置,方法是在您域的中创建具有以下内容的文件:
问题内容: 请看以下示例: 首先,存放在哪里?是吗: 由编译器复制到引用它的内部类的隐藏成员变量中 复制到堆并在堆上引用 留在堆栈上并以某种方式引用 其他的东西 我的 猜测 是第一选择。 其次,要做到这样做所引起的任何性能问题(而不是简单地作为类的成员变量创建并按其引用),尤其是当您创建大量引用最终局部变量的内部类构造时。 问题答案: 是的,它们已被复制,这就是为什么您必须将变量声明为final的
问题内容: 如果我在终端输入 … shell在哪里存储该环境变量? 我正在使用Ubuntu 8.10。我查看了文件〜/ .profile和/ etc / profile,找不到DISPLAY的痕迹。 问题答案: 进程的环境变量在运行时存在,并且未存储在某些文件中。它们存储在进程自己的内存中(在那里,它们会传递给子进程)。但是其中有一个虚拟文件 该文件显示了在调用进程时传递的所有环境变量(除非进程覆
本文向大家介绍对象,方法和变量在Java的内存中存储在哪里?,包括了对象,方法和变量在Java的内存中存储在哪里?的使用技巧和注意事项,需要的朋友参考一下 有五个主要内存区域,用于各种Java元素。以下是相同的列表。 类区域-该区域包含类的静态成员。 方法区域-此区域包含方法定义和可执行代码。 堆区域-该区域包含动态分配/取消分配的对象。如果某个对象不再被任何实时引用引用,则将其释放。 堆栈区域-
问题内容: Oracle数据库中存储的已加载Java类的Java字节码在哪里?具体来说,是否有一个视图或表可用于获取Oracle中Java类模式对象的原始字节? 问题答案: 如果使用CREATE JAVA SOURCE命令将Java Source加载到Oracle数据库中,则可以转到数据字典视图USER_SOURCE并找到您的Java Source。 如果需要显示它或其他内容,可以签出DBMS_J
我无法让这个C#解决方案(点击下载-666MB或在GitHub上浏览此处)编译: 我得到的错误是 此项目引用了此计算机上缺少的NuGet包。使用NuGet包还原来下载它们。如需详细资讯,请参阅http://go.microsoft.com/fwlink/?LinkID=322105.遗失的档案是..\ packages \ accord . 3 . 8 . 0 \ build \ accord .