Общий вопрос: у Java есть куча и локальный стек. Можете ли вы получить доступ к любому объекту из кучи?
Вопрос
Я действительно смотрел на различия между передачей по значению и тем, как Java распределяет объекты, и что делает Java для помещения объектов в стек.
Есть ли способ доступа к объектам, расположенным в куче? Какие механизмы задействует Java, чтобы гарантировать, что правильный метод может получить доступ к нужным данным из кучи?
Кажется, что если вы были хитры и, возможно, даже манипулировали байт-кодом Java во время выполнения, вы могли бы манипулировать данными из кучи, когда этого не требуется?
Решение
В наборе команд JVM нет инструкции, которая дает произвольный доступ к куче. Следовательно, манипулирование байт-кодом здесь вам не поможет.
В JVM также есть верификатор. Он проверяет код каждого метода (поскольку класс загружается), чтобы убедиться, что метод не пытается извлечь больше значений из стека выполнения, чем то, что он поместил в него. Это гарантирует, что метод не может " см. & Quot; объекты, указанные его вызывающим методом.
Наконец, локальные переменные хранятся в массиве для метода (известный как «массив локальных переменных»). Опять же, верификатор проверяет, что каждая инструкция чтения / записи из / в этот массив указывает индекс, который меньше размера массива. Обратите внимание, что эти инструкции JVM могут указывать только постоянный индекс. Они не могут получить вычисленное значение и использовать его в качестве индекса.
Итак, резюмируем, ответ - нет.
Другие советы
Все объекты в Java расположены в куче. Я не совсем уверен, что вы подразумеваете под "доступом к объектам из кучи". Единственное, что хранится в стеке, это список функций, которые вызваны в текущий контекст, и их локальные переменные и параметры. Все локальные переменные и параметры являются примитивными типами или ссылками.
Если вы выделяете объект с помощью new
(который является единственным способом выделения не примитивных типов; да, это включает типы массивов), тогда объект размещается в куче и ссылается на этот объект хранится либо в стеке, либо в куче, в зависимости от того, хранится ли ссылка в локальной переменной / параметре или как элемент другого объекта.
При передаче в качестве параметров функциям все объекты передаются по ссылке - если функция изменяет параметр, исходный объект также изменяется. Аналогично, можно также сказать, что ссылки на объекты передаются по значению - если вы измените параметр для ссылки на новый объект, он будет продолжать ссылаться на этот объект в течение всей функции, но исходный объект, который был передан в все равно будет ссылаться на все, что упоминалось ранее. Примитивные типы также передаются по значению.
Что касается объектов в стеке, то только новая виртуальная машина Java 6 от SUN (и, возможно, некоторых других) будет пытаться оптимизировать байт-код, помещая объекты в стек. Как правило, все объекты попадут в кучу. Для справки: http://www.ibm.com/ DeveloperWorks / Java / библиотека / J-jtp09275.html
Также спецификация JVM находится по адресу http : //java.sun.com/docs/books/jvms/second_edition/html/Overview.doc.html#6348 . JVM защищает свою кучу, просто не давая вам инструкции, необходимые для ее повреждения. Недостатки в реализации JVM могут привести к изменению вашего пробега.