Интерфейс 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<Field, |
getValues |
Получает значения нескольких экземпляров и/или статических полей в этом объекте. |
int |
hashCode() |
Возвращает значение хэш-кода для этого ObjectReference. |
Value |
invokeMethod |
Вызывает указанный Method для этого объекта в целевой виртуальной машине. |
boolean |
isCollected() |
Определяет, был ли этот объект собран сборщиком мусора в целевой виртуальной машине. |
ThreadReference |
owningThread() |
Возвращает ThreadReference для потока, если таковой имеется, который в настоящее время владеет монитором этого объекта. |
ReferenceType |
referenceType() |
Получает ReferenceType, который отображает тип этого объекта. |
List<ObjectReference> |
referringObjects |
Возвращает объекты, которые напрямую ссылаются на этот объект. |
void |
setValue |
Устанавливает значение заданного экземпляра или статического поля в этом объекте. |
long |
uniqueID() |
Возвращает уникальный идентификатор для этого ObjectReference. |
List<ThreadReference> |
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, содержащих запрашиваемые значения. - Возвращает:
- a Map запрошенных объектов
Fieldсо своимиValue. - Исключения:
-
IllegalArgumentException- если какое-либо поле не валидно для класса этого объекта.
setValue
void setValue(Field field, Value value) throws InvalidTypeException, ClassNotLoadedException
Field должно быть валидным для этого ObjectReference; то есть, оно должно быть из класса отражаемого объекта или его суперкласса. Если статическое, поле не должно быть final. Значения объектов должны быть совместимы по присваиванию с типом поля (Это подразумевает, что тип поля должен быть загружен через загрузчик классов окружающего класса). Примитивные значения должны быть либо совместимы по присваиванию с типом поля, либо должны быть конвертируемы в тип поля без потери информации. См. раздел 5.2 Спецификации языка Java для получения дополнительной информации о совместимости присваивания.
- Параметры:
-
field- поле, содержащее запрашиваемое значение -
value- новое значение для присваивания - Исключения:
-
IllegalArgumentException- если поле не валидно для класса этого объекта. -
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. Чтобы избежать этого, все EventRequests должны быть отключены до вызова 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:
- длинное уникальное ID
Ожидающие потоки
List<ThreadReference> waitingThreads() throws IncompatibleThreadStateException
ThreadReference для каждого потока, который в настоящее время ожидает монитора этого объекта. См. ThreadReference.currentContendedMonitor() для информации о том, когда поток считается ожидающим монитора. Не все целевые виртуальные машины поддерживают эту операцию. Используйте VirtualMachine#canGetMonitorInfo, чтобы определить, поддерживается ли операция.
- Возвращает:
- список объектов
ThreadReference. Список имеет нулевую длину, если потоки не ожидают монитора. - Исключение:
-
UnsupportedOperationException- если целевая виртуальная машина не поддерживает эту операцию. -
IncompatibleThreadStateException- если какой-либо ожидающий поток не приостановлен в целевой виртуальной машине
Владеющий поток
ThreadReference owningThread() throws IncompatibleThreadStateException
ThreadReference потока, если таковой имеется, который в настоящее время владеет монитором этого объекта. См. ThreadReference.ownedMonitors() для определения владения. Не все целевые виртуальные машины поддерживают эту операцию. Используйте VirtualMachine#canGetMonitorInfo, чтобы определить, поддерживается ли операция.
- Возвращает:
ThreadReference, который в настоящее время владеет монитором, или null, если он не владеет.- Исключение:
-
UnsupportedOperationException- если целевая виртуальная машина не поддерживает эту операцию. -
IncompatibleThreadStateException- если владеющий поток не приостановлен в целевой виртуальной машине
Количество входов
int entryCount() throws IncompatibleThreadStateException
ThreadReference.ownedMonitors() для определения владения. Не все целевые виртуальные машины поддерживают эту операцию. Используйте VirtualMachine#canGetMonitorInfo, чтобы определить, поддерживается ли операция.
- Возвращает:
- целое число, представляющее количество входов.
- Исключение:
-
UnsupportedOperationException- если целевая виртуальная машина не поддерживает эту операцию. -
IncompatibleThreadStateException- если владеющий поток не приостановлен в целевой виртуальной машине - См. также:
Ссылки на объекты
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, 2021, 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/17/docs/api/jdk.jdi/com/sun/jdi/ObjectReference.html