Spec-Zone.ru › OpenJDK 25

Интерфейс ObjectReference

Все суперинтерфейсы:
Mirror, Value
Все известные подинтерфейсы:
ArrayReference, ClassLoaderReference, ClassObjectReference, ModuleReference, StringReference, ThreadGroupReference, ThreadReference
public interface ObjectReference extends Value
Объект, который в настоящее время существует в целевой виртуальной машине. ObjectReference представляет только сам объект и не связан с каким-либо Field или LocalVariable, которому он в данный момент присвоен. На ObjectReference может ссылаться 0 или более полей и/или переменных.

Любой метод в ObjectReference, который прямо или косвенно принимает ObjectReference в качестве параметра, может выбросить VMDisconnectedException, если соединение с целевой виртуальной машиной разорвано, а VMDisconnectEvent уже доступно для чтения или станет доступно из EventQueue.

Любой метод в ObjectReference, который прямо или косвенно принимает ObjectReference в качестве параметра, может выбросить VMOutOfMemoryException, если в целевой виртуальной машине закончилась память.

Любой метод в ObjectReference или метод, который прямо или косвенно принимает ObjectReference в качестве параметра, может выбросить ObjectCollectedException, если зеркальный объект был удалён сборщиком мусора.

Начиная с версии:
1.3

Краткое описание полей

Модификатор и тип Поле Описание
static final int INVOKE_NONVIRTUAL
Выполняет невиртуальный вызов метода
static final int INVOKE_SINGLE_THREADED
Выполняет вызов метода, возобновляя только вызывающий поток

Краткое описание методов

Модификатор и тип Метод Описание
void disableCollection()
Предотвращает сборку мусора для этого объекта.
void enableCollection()
Разрешает сборку мусора для этого объекта.
int entryCount()
Возвращает количество раз, которое монитор этого объекта был захвачен текущим владеющим потоком, если владеющий поток является платформенным потоком; возвращает 0, если объектом не владеет платформенный поток.
boolean equals(Object obj)
Сравнивает указанный Object с этим ObjectReference на равенство.
Value getValue(Field sig)
Получает значение заданного нестатического или статического поля этого объекта.
Map<Field,Value> getValues(List<? extends Field> fields)
Получает значения нескольких нестатических и/или статических полей этого объекта.
int hashCode()
Возвращает значение хеш-кода этого ObjectReference.
Value invokeMethod(ThreadReference thread, Method method, List<? extends Value> arguments, int options)
Вызывает указанный Method для этого объекта в целевой виртуальной машине.
boolean isCollected()
Определяет, был ли этот объект удалён сборщиком мусора в целевой виртуальной машине.
ThreadReference owningThread()
Возвращает ThreadReference платформенного потока, если таковой имеется, который в данный момент владеет монитором этого объекта.
ReferenceType referenceType()
Получает ReferenceType, представляющий тип этого объекта.
List<ObjectReference> referringObjects(long maxReferrers)
Возвращает объекты, непосредственно ссылающиеся на этот объект.
void setValue(Field field, Value value)
Устанавливает значение заданного нестатического или статического поля этого объекта.
long uniqueID()
Возвращает уникальный идентификатор этого ObjectReference.
List<ThreadReference> waitingThreads()
Возвращает List, содержащий ThreadReference для каждого платформенного потока, который в данный момент ожидает освобождения монитора этого объекта.

Методы, объявленные в интерфейсе Mirror

toString, virtualMachine

Методы, объявленные в интерфейсе Value

type

Подробное описание полей

INVOKE_SINGLE_THREADED

static final int INVOKE_SINGLE_THREADED
Выполняет вызов метода, возобновляя только вызывающий поток
См. также:
  • Значения константных полей

INVOKE_NONVIRTUAL

static final int INVOKE_NONVIRTUAL
Выполняет невиртуальный вызов метода
См. также:
  • Значения константных полей

Подробное описание методов

referenceType

ReferenceType referenceType()
Получает ReferenceType, представляющий тип этого объекта. Тип может быть подклассом или реализацией объявленного типа любого поля или переменной, в которых он хранится в данный момент. Например, сразу после следующего оператора.

Object obj = new String("Hello, world!");

ReferenceType объекта obj будет представлять java.lang.String, а не java.lang.Object.

Тип объекта никогда не меняется, поэтому этот метод будет возвращать один и тот же ReferenceType на протяжении всего времени существования зеркального объекта.

Возвращённый ReferenceType будет иметь тип ClassType или ArrayType, но никогда не будет иметь тип InterfaceType.

Возвращает:
ReferenceType для этого объекта.

getValue

Value getValue(Field sig)
Получает значение заданного нестатического или статического поля этого объекта. Field должен быть допустим для этого ObjectReference, то есть принадлежать классу зеркального объекта или его суперклассу.
Параметры:
sig — поле, содержащее запрошенное значение
Возвращает:
Value нестатического поля.
Выбрасывает:
IllegalArgumentException — если поле недопустимо для класса этого объекта.

getValues

Map<Field,Value> getValues(List<? extends Field> fields)
Получает значения нескольких нестатических и/или статических полей этого объекта. Поля должны быть допустимы для этого ObjectReference, то есть принадлежать классу зеркального объекта или его суперклассу.
Параметры:
fields — список объектов Field, содержащих запрошенные значения.
Возвращает:
Map запрошенных объектов Field и соответствующих им Value.
Выбрасывает:
IllegalArgumentException — если какое-либо поле недопустимо для класса этого объекта.

setValue

void setValue(Field field, Value value) throws InvalidTypeException, ClassNotLoadedException
Устанавливает значение заданного нестатического или статического поля этого объекта. Field должен быть допустим для этого ObjectReference, то есть принадлежать классу зеркального объекта или его суперклассу. Поле не должно быть final.

Объектные значения должны быть совместимы с типом поля при присваивании (это означает, что тип поля должен быть загружен загрузчиком классов объемлющего класса). Значения примитивных типов должны быть совместимы с типом поля при присваивании либо преобразуемы к типу поля без потери информации. Дополнительные сведения о совместимости при присваивании см. в разделе 5.2 Спецификации языка Java.

Параметры:
field — поле, содержащее запрошенное значение
value — новое присваиваемое значение
Выбрасывает:
IllegalArgumentException — если поле недопустимо для класса этого объекта или поле имеет модификатор final.
InvalidTypeException — если тип значения не соответствует типу поля.
ClassNotLoadedException — если значение не равно null, а тип поля ещё не был загружен подходящим загрузчиком классов.
VMCannotBeModifiedException — если VirtualMachine доступна только для чтения — см. VirtualMachine.canBeModified().

invokeMethod

Value invokeMethod(ThreadReference thread, Method method, List<? extends Value> arguments, int options) throws InvalidTypeException, ClassNotLoadedException, IncompatibleThreadStateException, InvocationException
Вызывает указанный Method для этого объекта в целевой виртуальной машине. Указанный метод может быть определён в классе этого объекта, в суперклассе этого класса или в интерфейсе, реализуемом этим объектом. Метод может быть статическим или нестатическим, но не статическим инициализатором или конструктором. Чтобы создать новый объект и выполнить его конструктор, используйте ClassType.newInstance(ThreadReference, Method, List, int).

Вызов метода будет выполнен в указанном потоке. Вызвать метод можно только в том случае, если указанный поток был приостановлен событием, возникшим в этом потоке. Вызов метода не поддерживается, если целевая виртуальная машина была приостановлена с помощью VirtualMachine.suspend() или указанный поток был приостановлен с помощью ThreadReference.suspend().

Указанный метод вызывается с аргументами из заданного списка аргументов. Вызов метода является синхронным: этот метод не возвращает управление, пока вызванный метод не завершится в целевой виртуальной машине. Если вызванный метод выбросит исключение, этот метод выбросит InvocationException, содержащий зеркало объекта выброшенного исключения.

Объектные аргументы должны быть совместимы с типом аргумента при присваивании (это означает, что тип аргумента должен быть загружен загрузчиком классов объемлющего класса). Аргументы примитивных типов должны быть совместимы с типом аргумента при присваивании либо преобразуемы к типу аргумента без потери информации. Если вызываемый метод принимает переменное число аргументов, тип последнего аргумента — массив некоторого типа компонентов. Аргумент в соответствующей позиции можно опустить, указать как null, передать как массив того же типа компонентов или указать аргумент типа компонентов, за которым следует любое количество других аргументов того же типа. Если аргумент опущен, передаётся массив типа компонентов длины 0. Тип компонентов может быть примитивным типом. Автоупаковка не поддерживается. Дополнительные сведения о совместимости при присваивании см. в разделе 5.2 Спецификации языка Java.

По умолчанию метод вызывается с динамическим поиском, описанным в разделе 15.12.4.4 Спецификации языка Java; в частности, будет применяться переопределение с учётом типа объекта во время выполнения, зеркалом которого является этот ObjectReference. Это поведение можно изменить, указав битовый флаг INVOKE_NONVIRTUAL в аргументе options. Если этот флаг установлен, указанный метод вызывается независимо от того, переопределён ли он для типа этого объекта во время выполнения. В таком случае метод должен иметь реализацию в классе или интерфейсе. Эта возможность полезна для выполнения вызовов методов, аналогичных вызовам с ключевым словом super в языке программирования Java.

По умолчанию на время вызова метода возобновляется выполнение всех потоков целевой виртуальной машины, если ранее они были приостановлены событием, с помощью VirtualMachine.suspend() или ThreadReference.suspend(). Это делается для предотвращения взаимных блокировок, возникающих, если потоки владеют ресурсами, например мониторами, необходимыми вызываемому методу. Однако следует учитывать, что это неявное возобновление действует точно так же, как ThreadReference.resume(); поэтому, если счётчик приостановки потока больше 1, поток останется приостановленным на время вызова, и взаимная блокировка всё ещё может возникнуть. По умолчанию после завершения вызова все потоки целевой виртуальной машины приостанавливаются независимо от их состояния до вызова. Во время вызова могут возникнуть точки останова или другие события. Это может привести к описанным выше взаимным блокировкам. Взаимная блокировка также может возникнуть, если invokeMethod вызван из потока обработчика событий клиента. В этом случае поток будет ожидать завершения invokeMethod и не будет считывать EventSet, поступивший для нового события. Если новый EventSet имеет тип SUSPEND_ALL, возникнет взаимная блокировка, поскольку никто не возобновит EventSet. Чтобы этого избежать, перед вызовом invokeMethod следует отключить все EventRequests либо не вызывать invokeMethod из потока обработчика событий клиента.

Возобновление других потоков во время вызова можно предотвратить, указав битовый флаг INVOKE_SINGLE_THREADED в аргументе options; однако описанные выше взаимные блокировки никак не предотвращаются и не устраняются, поэтому эту возможность следует использовать с большой осторожностью. Возобновлён будет только указанный поток (как описано выше для всех потоков). По завершении однопоточного вызова вызывающий поток снова приостанавливается. Обратите внимание, что потоки, запущенные во время однопоточного вызова, не будут приостановлены по его завершении.

Если во время вызова соединение с целевой виртуальной машиной будет разорвано (например, с помощью VirtualMachine.dispose()), вызов метода продолжится.

Примечание к API:
Виртуальные потоки обычно являются потоками пользовательского режима, планируемыми средой выполнения Java, а не операционной системой. Поэтому при использовании виртуальных потоков может возникать больше ситуаций, в которых параметр INVOKE_SINGLE_THREADED приводит к взаимной блокировке. Например, приостановка всех потоков в целевой виртуальной машине может приостановить потоки, обеспечивающие работу таймера виртуальных потоков, и тем самым привести к взаимной блокировке таких методов, как Thread.sleep(long).
Параметры:
thread — поток, в котором нужно выполнить вызов.
method — вызываемый Method.
arguments — список аргументов Value, передаваемых вызываемому методу. Значения из списка назначаются аргументам в порядке их следования в сигнатуре метода.
options — параметры в виде целочисленного битового флага.
Возвращает:
зеркало Value возвращаемого значения вызванного метода.
Выбрасывает:
IllegalArgumentException — если метод не является членом класса этого объекта, размер списка аргументов не совпадает с количеством объявленных аргументов метода, метод является конструктором или статическим инициализатором либо указан INVOKE_NONVIRTUAL, а метод является абстрактным.
ClassNotLoadedException — если тип какого-либо аргумента ещё не был загружен подходящим загрузчиком классов.
IncompatibleThreadStateException — если указанный поток не был приостановлен событием.
InvocationException — если вызов метода привёл к исключению в целевой виртуальной машине.
InvalidTypeException — если аргументы не соответствуют этому требованию: объектные аргументы должны быть совместимы с типом аргумента при присваивании. Это означает, что тип аргумента должен быть загружен загрузчиком классов объемлющего класса. Аргументы примитивных типов должны быть совместимы с типом аргумента при присваивании либо преобразуемы к типу аргумента без потери информации. Дополнительные сведения о совместимости при присваивании см. в разделе 5.2 JLS.
VMCannotBeModifiedException — если VirtualMachine доступна только для чтения — см. VirtualMachine.canBeModified().

disableCollection

void disableCollection()
Предотвращает сборку мусора для этого объекта. По умолчанию все значения ObjectReference, возвращаемые JDI, могут быть удалены сборщиком мусора в любой момент, пока целевая виртуальная машина работает. Вызов этого метода гарантирует, что объект не будет удалён сборщиком мусора. Чтобы снова разрешить сборку мусора, можно использовать enableCollection().

Вызовы этого метода учитываются. Для каждого вызова этого метода требуется соответствующий вызов enableCollection(), прежде чем сборка мусора будет снова разрешена.

Обратите внимание, что пока целевая виртуальная машина приостановлена, сборка мусора не выполняется, поскольку все потоки приостановлены. Обычная проверка переменных, полей и массивов во время приостановки безопасна и не требует явного отключения сборки мусора.

Этот метод следует использовать редко, поскольку он изменяет характер сборки мусора в целевой виртуальной машине и, следовательно, может привести к тому, что поведение приложения под отладчиком будет отличаться от поведения без отладки.

Выбрасывает:
VMCannotBeModifiedException — если VirtualMachine доступна только для чтения — см. VirtualMachine.canBeModified().

enableCollection

void enableCollection()
Разрешает сборку мусора для этого объекта. По умолчанию все значения ObjectReference, возвращаемые JDI, могут быть удалены сборщиком мусора в любой момент, пока целевая виртуальная машина работает. Этот метод необходимо вызывать только в том случае, если сборка мусора ранее была отключена с помощью disableCollection().
Выбрасывает:
VMCannotBeModifiedException — если VirtualMachine доступна только для чтения — см. VirtualMachine.canBeModified().

isCollected

boolean isCollected()
Определяет, был ли этот объект удалён сборщиком мусора в целевой виртуальной машине.
Возвращает:
true, если этот ObjectReference был удалён сборщиком мусора; false в противном случае.
Выбрасывает:
VMCannotBeModifiedException — если VirtualMachine доступна только для чтения — см. VirtualMachine.canBeModified().

uniqueID

long uniqueID()
Возвращает уникальный идентификатор этого ObjectReference. Он гарантированно уникален среди всех ObjectReference одной и той же виртуальной машины, которые ещё не были освобождены. Эта гарантия действует, пока данный ObjectReference не освобождён.
Возвращает:
уникальный идентификатор типа long

waitingThreads

List<ThreadReference> waitingThreads() throws IncompatibleThreadStateException
Возвращает List, содержащий ThreadReference для каждого платформенного потока, который в данный момент ожидает освобождения монитора этого объекта. Сведения о том, когда поток считается ожидающим монитор, см. в описании ThreadReference.currentContendedMonitor().

Не все целевые виртуальные машины поддерживают эту операцию. Чтобы определить, поддерживается ли она, см. VirtualMachine.canGetMonitorInfo().

Возвращает:
список объектов ThreadReference. Список имеет нулевую длину, если ни один поток не ожидает монитор или его ожидают только виртуальные потоки.
Выбрасывает:
UnsupportedOperationException — если целевая виртуальная машина не поддерживает эту операцию.
IncompatibleThreadStateException — если какой-либо ожидающий поток не приостановлен в целевой виртуальной машине

owningThread

ThreadReference owningThread() throws IncompatibleThreadStateException
Возвращает ThreadReference платформенного потока, если таковой имеется, который в данный момент владеет монитором этого объекта. Определение владения см. в описании ThreadReference.ownedMonitors().

Не все целевые виртуальные машины поддерживают эту операцию. Чтобы определить, поддерживается ли она, см. VirtualMachine.canGetMonitorInfo().

Возвращает:
ThreadReference платформенного потока, который в данный момент владеет монитором, или null, если монитор принадлежит виртуальному потоку либо никому не принадлежит.
Выбрасывает:
UnsupportedOperationException — если целевая виртуальная машина не поддерживает эту операцию.
IncompatibleThreadStateException — если владеющий поток не приостановлен в целевой виртуальной машине

entryCount

int entryCount() throws IncompatibleThreadStateException
Возвращает количество раз, которое монитор этого объекта был захвачен текущим владеющим потоком, если владеющий поток является платформенным; возвращает 0, если объектом не владеет платформенный поток. Определение владения см. в описании ThreadReference.ownedMonitors().

Не все целевые виртуальные машины поддерживают эту операцию. Чтобы определить, поддерживается ли она, см. VirtualMachine.canGetMonitorInfo().

Возвращает:
целочисленное количество захватов.
Выбрасывает:
UnsupportedOperationException — если целевая виртуальная машина не поддерживает эту операцию.
IncompatibleThreadStateException — если владеющий поток не приостановлен в целевой виртуальной машине
См. также:
  • owningThread()

referringObjects

List<ObjectReference> referringObjects(long maxReferrers)
Возвращает объекты, непосредственно ссылающиеся на этот объект. Возвращаются только объекты, достижимые с точки зрения сборки мусора. Обратите внимание, что на объект могут ссылаться и другими способами, например из локальной переменной в кадре стека или из глобальной ссылки JNI. Этот метод не возвращает такие ссылки, не являющиеся объектами.

Не все целевые виртуальные машины поддерживают эту операцию. Чтобы определить, поддерживается ли она, используйте VirtualMachine.canGetInstanceInfo().

Параметры:
maxReferrers — максимальное количество возвращаемых объектов, ссылающихся на этот объект. Значение должно быть неотрицательным. Если оно равно нулю, возвращаются все ссылающиеся объекты.
Возвращает:
список объектов ObjectReference. Если на этот объект не ссылается ни один объект, возвращается пустой список..
Выбрасывает:
UnsupportedOperationException — если целевая виртуальная машина не поддерживает эту операцию — см. VirtualMachine.canGetInstanceInfo()
IllegalArgumentException — если maxReferrers меньше нуля.
Начиная с версии:
1.6
См. также:
  • VirtualMachine.instanceCounts(List)
  • ReferenceType.instances(long)

equals

boolean equals(Object obj)
Сравнивает указанный Object с этим ObjectReference на равенство.
Переопределяет:
equals в классе Object
Параметры:
obj — объект-ссылка, с которым выполняется сравнение.
Возвращает:
true, если Object является ObjectReference, ObjectReference принадлежат одной и той же виртуальной машине и применение оператора "==" к зеркальным объектам в этой виртуальной машине даёт значение true.
См. также:
  • Object.hashCode()
  • HashMap

hashCode

int hashCode()
Возвращает значение хеш-кода этого ObjectReference.
Переопределяет:
hashCode в классе Object
Возвращает:
целочисленный хеш-код
См. также:
  • Object.equals(java.lang.Object)
  • System.identityHashCode(Object)

Сообщить об ошибке или предложить улучшение
Дополнительные справочные материалы по API и документацию для разработчиков см. в разделе Документация Java SE, содержащем более подробные описания для разработчиков, концептуальные обзоры, определения терминов, обходные решения и рабочие примеры кода. Другие версии.
Java является товарным знаком или зарегистрированным товарным знаком Oracle и/или её аффилированных лиц в США и других странах.
Авторские права © 1993, 2025, Oracle и/или её аффилированные лица, 500 Oracle Parkway, Redwood Shores, CA 94065 USA.
Все права защищены. Использование регулируется условиями лицензии и политикой распространения документации.

© 1993, 2025, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/25/docs/api/jdk.jdi/com/sun/jdi/ObjectReference.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API