Интерфейс 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() |
Возвращает количество раз, когда монитор этого объекта был захвачен текущим владеющим потоком. |
boolean |
equals |
Сравнивает указанный объект с этим 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() |
Возвращает список, содержащий ThreadReference для каждого потока, в данный момент ожидающего монитор этого объекта. |
Методы, объявленные в интерфейсе com.sun.jdi.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.
- Возвращает:
- the
ReferenceTypeдля этого объекта.
getValue
Value getValue(Field sig)
- Параметры:
-
sig- поле, содержащее запрашиваемое значение - Возвращает:
- the
Valueзначения поля экземпляра. - Исключения:
-
IllegalArgumentException- если поле не является валидным для класса этого объекта.
getValues
Map<Field,Value> getValues(List<? extends Field> fields)
- Параметры:
-
fields- список объектовField, содержащих запрашиваемые значения. - Возвращает:
- карта запрашиваемых объектов
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- если 'value' не 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, массивом того же базового типа, или аргументом базового типа, за которым следует любое количество других аргументов того же типа. Если аргумент опущен, то передаётся массив нулевой длины базового типа. Базовый тип может быть примитивным типом. Автоупаковка не поддерживается. См. раздел 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. Чтобы этого избежать, все EventRequest должны быть отключены до выполнения invokeMethod или invokeMethod не должен выполняться из обработчика событий клиента.
Возобновление других нитей во время вызова может быть предотвращено путём указания флага INVOKE_SINGLE_THREADED в options аргументе; однако никакой защиты или восстановления от тупиковых ситуаций, описанных выше, не предусмотрено, поэтому этот параметр следует использовать с большой осторожностью. Возобновляется только указанная нить (как описано для всех нитей выше). По завершении вызова в единственной нити вызывающая нить будет приостановлена ещё раз. Обратите внимание, что любые нити, запущенные во время вызова в единственной нити, не будут приостановлены по завершении вызова.
Если целевая виртуальная машина отключается во время вызова (например, через VirtualMachine.dispose()), вызов метода продолжается.
- Parameters:
-
thread- нить, в которой необходимо выполнить вызов. -
method-Methodдля вызова. -
arguments- списокValueаргументов, привязанных к вызываемому методу. Значения из списка присваиваются аргументам в порядке их появления в сигнатуре метода. -
options- целое число со значениями флагов опций. - Returns:
- зеркало
Valueвозвращаемого значения вызываемого метода. - Throws:
-
IllegalArgumentException- если метод не является членом класса этого объекта, если размер списка аргументов не соответствует числу объявленных аргументов для метода, если метод является конструктором или статическим инициализатором, или еслиINVOKE_NONVIRTUALуказан, и метод является абстрактным. -
ClassNotLoadedException- если какой-либо тип аргумента ещё не был загружен через соответствующий загрузчик классов. -
IncompatibleThreadStateException- если указанная нить не была приостановлена событием. -
InvocationException- если вызов метода привёл к исключению в целевой виртуальной машине. -
InvalidTypeException- Если типы аргументов не соответствуют этому требованию — Аргументы объекта должны быть совместимы с типом аргумента. Это подразумевает, что тип аргумента должен быть загружен через загрузчик класса, содержащего его. Примитивные аргументы должны быть либо совместимы по присваиванию с типом аргумента, либо должны быть преобразуемы в тип аргумента без потери информации. См. раздел 5.2 JLS для получения дополнительной информации о совместимости по присваиванию. -
VMCannotBeModifiedException- если VirtualMachine является только для чтения — см.VirtualMachine.canBeModified().
disableCollection
void disableCollection()
ObjectReference значения, возвращаемые JDI, могут быть собраны в любой момент работы целевой виртуальной машины. Вызов этого метода гарантирует, что объект не будет собран. enableCollection() может быть использован для разрешения сбора мусора снова. Вызовы этого метода считаются. Каждый вызов этого метода требует соответствующего вызова enableCollection() до повторного разрешения сбора мусора.
Обратите внимание, что пока целевая виртуальная машина приостановлена, сборка мусора не выполняется, потому что все нити приостановлены. Обычное изучение переменных, полей и массивов во время приостановки безопасно без явного отключения сбора мусора.
Этот метод следует использовать экономно, так как он изменяет схему сбора мусора в целевой виртуальной машине и, следовательно, может привести к поведению приложения под отладчиком, которое отличается от его поведения без отладки.
- Throws:
-
VMCannotBeModifiedException- если VirtualMachine только для чтения - см.VirtualMachine.canBeModified().
enableCollection
void enableCollection()
ObjectReference значения, возвращаемые JDI, могут быть собраны в любой момент работы целевой виртуальной машины. Вызов этого метода необходим только в том случае, если сборка мусора была ранее отключена с помощью disableCollection().- Throws:
-
VMCannotBeModifiedException- если VirtualMachine только для чтения - см.VirtualMachine.canBeModified().
isCollected
boolean isCollected()
- Returns:
-
trueесли этотObjectReferenceбыл собран;falseв противном случае. - Throws:
-
VMCannotBeModifiedException- если VirtualMachine только для чтения - см.VirtualMachine.canBeModified().
uniqueID
long uniqueID()
- Returns:
- уникальный идентификатор long
waitingThreads
List<ThreadReference> waitingThreads() throws IncompatibleThreadStateException
ThreadReference для каждой нити, которая в данный момент ожидает монитора этого объекта. См. ThreadReference.currentContendedMonitor() для получения информации о том, когда нить считается ожидающей монитора. Не все целевые виртуальные машины поддерживают эту операцию. См. VirtualMachine#canGetMonitorInfo, чтобы определить, поддерживается ли операция.
- Returns:
- список
ThreadReferenceобъектов. Список имеет нулевую длину, если ни одна нить не ожидает монитора. - Throws:
-
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- если целевая виртуальная машина не поддерживает эту операцию - см.canGetInstanceInfo() -
IllegalArgumentException- если maxReferrers меньше нуля. - С тех пор, как:
- 1.6
- См. также:
equals
boolean equals(Object obj)
- Переопределяет:
-
equalsв классеObject - Параметры:
-
obj- объект-ссылка для сравнения. - Возвращает:
- true, если объект является ObjectReference, если ObjectReferences принадлежат одной и той же виртуальной машине и если применение оператора "==" к отражённым объектам в этой виртуальной машине даёт true.
- См. также:
hashCode
int hashCode()
- Переопределяет:
-
hashCodeв классеObject - Возвращает:
- целое значение хэш-кода
- См. также:
© 1993, 2023, 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/21/docs/api/jdk.jdi/com/sun/jdi/ObjectReference.html