Интерфейс 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 int | INVOKE_NONVIRTUAL | Выполнение невиртуального вызова метода |
static int | INVOKE_SINGLE_THREADED | Выполнение вызова метода только с возобновленным вызывающим потоком |
Методы
| Модификатор и тип | Метод | Описание |
|---|---|---|
void | disableCollection() | Препятствует сбору мусора для этого объекта. |
void | enableCollection() | Разрешает сбор мусора для этого объекта. |
int | entryCount() | Возвращает количество раз, когда монитор этого объекта был введён текущим владеющим потоком. |
boolean | equals(Object obj) | Сравнивает указанный объект с этим 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) | Вызывает указанный |
boolean | isCollected() | Определяет, был ли этот объект собран сборщиком мусора в целевой виртуальной машине. |
ThreadReference | owningThread() | Возвращает |
ReferenceType | referenceType() | Получает |
List<ObjectReference> | referringObjects(long maxReferrers) | Возвращает объекты, которые напрямую ссылаются на этот объект. |
void | setValue(Field field,
Value value) | Устанавливает значение заданного экземпляра или статического поля в этом объекте. |
long | uniqueID() | Возвращает уникальный идентификатор для этого ObjectReference. |
List<ThreadReference> | waitingThreads() | Возвращает список, содержащий |
Методы, объявленные в интерфейсе com.sun.jdi.Mirror
toString, virtualMachine Методы, объявленные в интерфейсе com.sun.jdi.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.
- Возвращает:
- the
ReferenceTypeдля этого объекта.
getValue
Value getValue(Field sig)
Получает значение заданного экземпляра или статического поля в этом объекте. Поле должно быть валидно для этого ObjectReference; то есть, оно должно принадлежать классу отражаемого объекта или его суперклассу.
- Параметры:
-
sig- поле, содержащее запрашиваемое значение - Возвращает:
- the
Valueполя экземпляра. - Исключения:
-
IllegalArgumentException- если поле не валидно для класса этого объекта.
getValues
Map<Field,Value> getValues(List<? extends Field> fields)
Получает значения нескольких полей экземпляра и/или статических полей в этом объекте. Поля должны быть валидны для этого ObjectReference; то есть, они должны принадлежать классу отражаемого объекта или его суперклассу.
- Параметры:
-
fields- список объектовField, содержащих запрашиваемые значения. - Возвращает:
- словарь запрашиваемых объектов
Fieldс ихValue. - Исключения:
-
IllegalArgumentException- если какое-либо поле не валидно для класса этого объекта.
setValue
void setValue(Field field,
Value value)
throws InvalidTypeException,
ClassNotLoadedException Устанавливает значение заданного экземпляра или статического поля в этом объекте. Field должно быть валидным для этого ObjectReference; то есть, оно должно принадлежать классу отражаемого объекта или его суперклассу. Если статическое, поле не должно быть final.
Значения объектов должны быть совместимы с типом поля (Это подразумевает, что тип поля должен быть загружен через загрузчик классов содержащего класса). Примитивные значения должны быть либо совместимы с типом поля, либо должны быть преобразуемы в тип поля без потери информации. См. раздел 5.2 спецификации языка Java™ для получения дополнительной информации о совместимости присваивания.
- Параметры:
-
field- поле, содержащее запрашиваемое значение -
value- новое значение для присвоения - Исключения:
-
IllegalArgumentException- если поле не валидно для класса этого объекта. -
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(com.sun.jdi.ThreadReference, com.sun.jdi.Method, java.util.List<? extends com.sun.jdi.Value>, 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. Для предотвращения этого все EventRequests должны быть отключены до выполнения invokeMethod или invokeMethod не должен выполняться из потока обработчика событий клиента.
Возобновление других потоков во время вызова можно предотвратить, указав флаг бита INVOKE_SINGLE_THREADED в аргументе options; однако нет защиты от или восстановления из тупиков, описанных выше, поэтому этот параметр следует использовать с большой осторожностью. Только указанный поток будет возобновлен (как описано для всех потоков выше). После завершения однопоточного вызова вызывающий поток будет приостановлен еще раз. Обратите внимание, что любые потоки, запущенные во время однопоточного вызова, не будут приостановлены при завершении вызова.
Если целевая виртуальная машина отключена во время вызова (например, через VirtualMachine.dispose()) вызов метода продолжается.
- Параметры:
-
thread- поток, в котором нужно вызвать метод. -
method-Methodдля вызова. -
arguments- список аргументовValue, привязанных к вызываемому методу. Значения из списка присваиваются аргументам в порядке их появления в сигнатуре метода. -
options- целочисленный флаг опций. - Возвращает:
- a
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 не будет удален.
- Возвращает:
- уникальный ID типа 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- если владеющий поток не приостановлен в целевой виртуальной машине - См. также:
owningThread()
referringObjects
List<ObjectReference> referringObjects(long maxReferrers)
Возвращает объекты, которые напрямую ссылаются на этот объект. Возвращаются только объекты, доступные для целей сбора мусора. Обратите внимание, что объект также может быть ссылаться иными способами, такими как из локальной переменной в кадре стека или из JNI глобальной ссылки. Такие не-объектные ссылки не возвращаются этим методом.
Не все целевые виртуальные машины поддерживают эту операцию. Используйте VirtualMachine.canGetInstanceInfo(), чтобы определить, поддерживается ли операция.
- Параметры:
-
maxReferrers- Максимальное количество объектов-ссылок, которые необходимо вернуть. Должно быть неотрицательным. Если ноль, возвращаются все объекты-ссылки. - Возвращает:
- список объектов
ObjectReference. Если нет объектов, ссылающихся на этот объект, возвращается список нулевой длины. - Исключение:
-
UnsupportedOperationException- если целевая виртуальная машина не поддерживает эту операцию - см.canGetInstanceInfo() -
IllegalArgumentException- если maxReferrers меньше нуля. - См. также:
-
VirtualMachine.instanceCounts(List),ReferenceType.instances(long)
equals
boolean equals(Object obj)
Сравнивает указанный объект с этим ObjectReference на равенство.
- Переопределяет:
-
equalsв классеObject - Параметры:
-
obj- объект ссылки, с которым необходимо сравнить. - Возвращает:
- true, если объект является ObjectReference, если ObjectReferences принадлежат одной виртуальной машине и если применение оператора "==" к зеркальным объектам в этой виртуальной машине возвращает true.
- См. также:
-
Object.hashCode(),HashMap
hashCode
int hashCode()
Возвращает значение хэш-кода для этого ObjectReference.
- Переопределяет:
-
hashCodeв классеObject - Возвращает:
- целое значение хэш-кода
- См. также:
-
Object.equals(java.lang.Object),System.identityHashCode(java.lang.Object)
© 1993, 2020, 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/11/docs/api/jdk.jdi/com/sun/jdi/ObjectReference.html