我真的在研究按值传递与 Java 如何分配对象以及 java 将对象放入堆栈的方式之间的差异。
有没有办法访问分配在堆上的对象? java 执行什么机制来保证正确的方法可以访问堆外的正确数据?
看起来,如果您很狡猾,甚至可能在运行时操纵 Java 字节码,那么您可能能够在不应该的时候操纵堆外的数据?
最佳答案
JVM 指令集中没有指令可以任意访问堆。因此,字节码操作在这里对您没有帮助。
JVM 也有一个 validator 。它检查每个方法的代码(在加载类时)以验证该方法不会尝试从执行堆栈中弹出比它压入其中的值更多的值。这确保方法无法“看到”其调用方法指向的对象。
最后,局部变量存储在每个方法的数组中(称为“局部变量数组”)。同样, validator 确保从/到该数组的每个读/写指令指定一个小于数组大小的索引。请注意,这些 JVM 指令只能指定一个常量索引。他们不能采用计算值并将其用作索引。
总结一下,答案是否定的。
关于java - 一般问题 : Java has the heap and local stack. 你能访问堆中的任何对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/289138/