Интерфейс ObjectReference
- Все суперинтерфейсы:
Mirror, Value
- Все известные подинтерфейсы:
ArrayReference, ClassLoaderReference, ClassObjectReference, ModuleReference, StringReference, ThreadGroupReference, ThreadReference
public interface ObjectReference extends Value
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 с этим ObjectReference на равенство. |
Value |
getValue |
Получает значение заданного нестатического или статического поля этого объекта. |
Map |
getValues |
Получает значения нескольких нестатических и/или статических полей этого объекта. |
int |
hashCode() |
Возвращает значение хеш-кода этого ObjectReference. |
Value |
invokeMethod |
Вызывает указанный Method для этого объекта в целевой виртуальной машине. |
boolean |
isCollected() |
Определяет, был ли этот объект удалён сборщиком мусора в целевой виртуальной машине. |
ThreadReference |
owningThread() |
Возвращает ThreadReference платформенного потока, если таковой имеется, который в данный момент владеет монитором этого объекта. |
ReferenceType |
referenceType() |
Получает ReferenceType, представляющий тип этого объекта. |
List |
referringObjects |
Возвращает объекты, непосредственно ссылающиеся на этот объект. |
void |
setValue |
Устанавливает значение заданного нестатического или статического поля этого объекта. |
long |
uniqueID() |
Возвращает уникальный идентификатор этого ObjectReference. |
List |
waitingThreads() |
Возвращает List, содержащий ThreadReference для каждого платформенного потока, который в данный момент ожидает освобождения монитора этого объекта. |
Методы, объявленные в интерфейсе Mirror
toString, virtualMachine
Подробное описание полей
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)
- Параметры:
-
sig— поле, содержащее запрошенное значение - Возвращает:
Valueнестатического поля.- Выбрасывает:
-
IllegalArgumentException— если поле недопустимо для класса этого объекта.
getValues
Map<Field,Value> getValues(List<? extends Field> fields)
- Параметры:
-
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()
- Возвращает:
- уникальный идентификатор типа long
waitingThreads
List<ThreadReference> waitingThreads() throws IncompatibleThreadStateException
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
ThreadReference.ownedMonitors(). Не все целевые виртуальные машины поддерживают эту операцию. Чтобы определить, поддерживается ли она, см. VirtualMachine.canGetMonitorInfo().
- Возвращает:
- целочисленное количество захватов.
- Выбрасывает:
-
UnsupportedOperationException— если целевая виртуальная машина не поддерживает эту операцию. -
IncompatibleThreadStateException— если владеющий поток не приостановлен в целевой виртуальной машине - См. также:
referringObjects
List<ObjectReference> referringObjects(long maxReferrers)
Не все целевые виртуальные машины поддерживают эту операцию. Чтобы определить, поддерживается ли она, используйте VirtualMachine.canGetInstanceInfo().
- Параметры:
-
maxReferrers— максимальное количество возвращаемых объектов, ссылающихся на этот объект. Значение должно быть неотрицательным. Если оно равно нулю, возвращаются все ссылающиеся объекты. - Возвращает:
- список объектов
ObjectReference. Если на этот объект не ссылается ни один объект, возвращается пустой список.. - Выбрасывает:
-
UnsupportedOperationException— если целевая виртуальная машина не поддерживает эту операцию — см.VirtualMachine.canGetInstanceInfo() -
IllegalArgumentException— если maxReferrers меньше нуля. - Начиная с версии:
- 1.6
- См. также:
equals
boolean equals(Object obj)
- Переопределяет:
-
equalsв классеObject - Параметры:
-
obj— объект-ссылка, с которым выполняется сравнение. - Возвращает:
- true, если Object является ObjectReference, ObjectReference принадлежат одной и той же виртуальной машине и применение оператора "==" к зеркальным объектам в этой виртуальной машине даёт значение true.
- См. также:
hashCode
© 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