-
- All Known Subinterfaces:
-
ArrayReference
,ClassLoaderReference
,ClassObjectReference
,ModuleReference
,StringReference
,ThreadGroupReference
,ThreadReference
public interface ObjectReference extends Value
当前存在于目标VM中的对象。 ObjectReference仅反映对象本身,并不属于当前分配给它的任何Field
或LocalVariable
。 ObjectReference可以有来自字段和/或变量的0个或多个引用。上的任何方法
ObjectReference
其直接或间接地采用ObjectReference
作为参数可能抛出VMDisconnectedException
如果目标VM断开且VMDisconnectEvent
已经或可用于被从读EventQueue
。如果目标虚拟机的内存
ObjectReference
,则直接或间接以ObjectReference
作为参数的任何方法可能会抛出VMOutOfMemoryException
。ObjectReference
任何方法或直接或间接采用ObjectReference
作为参数的方法可能会抛出ObjectCollectedException
(如果镜像对象已被垃圾回收)。- 从以下版本开始:
- 1.3
-
-
Field Summary
Fields Modifier and Type Field 描述 static int
INVOKE_NONVIRTUAL
执行非虚拟方法调用static int
INVOKE_SINGLE_THREADED
仅执行调用线程执行方法调用
-
方法摘要
所有方法 接口方法 抽象方法 Modifier and Type 方法 描述 void
disableCollection()
防止垃圾回收此对象。void
enableCollection()
允许垃圾回收此对象。int
entryCount()
返回此对象的显示器由当前拥有的线程输入的次数。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, List<? extends Value> arguments, int options)
在目标虚拟机中调用此对象上指定的方法
。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()
返回一个列表,其中包含当前等待该对象的显示器的每个线程的一个ThreadReference
。-
Methods inherited from interface com.sun.jdi.Mirror
toString, virtualMachine
-
-
-
-
字段详细信息
-
INVOKE_SINGLE_THREADED
static final int INVOKE_SINGLE_THREADED
仅执行调用线程执行方法调用- 另请参见:
- Constant Field Values
-
INVOKE_NONVIRTUAL
static final int INVOKE_NONVIRTUAL
执行非虚拟方法调用- 另请参见:
- Constant Field Values
-
-
方法详细信息
-
referenceType
ReferenceType referenceType()
获取反映该对象类型的ReferenceType
。 该类型可以是当前持有它的任何字段或变量的声明类型的子类或实现者。 例如,紧跟在下面的语句之后。Object obj = new String("Hello, world!");
obj的ReferenceType将镜像java.lang.String而不是java.lang.Object。
对象的类型永远不会更改,因此该方法将始终在镜像对象的生命周期中返回相同的ReferenceType。
返回的ReferenceType将为
ClassType
或ArrayType
,从不为InterfaceType
。- 结果
-
这个对象的
ReferenceType
。
-
getValue
Value getValue(Field sig)
获取此对象中给定实例或静态字段的值。 该字段必须对此ObjectReference有效; 也就是说,它必须来自镜像对象的类或该类的超类。- 参数
-
sig
- 包含请求值的字段 - 结果
-
实例字段的
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。对象值必须与字段类型分配兼容(这意味着字段类型必须通过封闭类的加载器加载)。 原始值必须与字段类型兼容,或必须可转换为字段类型,而不会丢失信息。 有关分配兼容性的更多信息,请参阅The Java™ Language Specification的 5.2节。
- 参数
-
field
- 包含请求值的字段 -
value
- 要分配的新值 - 异常
-
IllegalArgumentException
- 如果该字段对该对象的类无效。 -
InvalidTypeException
- 如果值的类型与字段的类型不匹配。 -
ClassNotLoadedException
- 如果'value'不为null,并且字段类型尚未通过适当的类加载器加载。 -
VMCannotBeModifiedException
- 如果VirtualMachine是只读的 - 请参阅VirtualMachine.canBeModified()
。
-
invokeMethod
Value invokeMethod(ThreadReference thread, 方法 method, List<? extends Value> arguments, int options) throws InvalidTypeException, ClassNotLoadedException, IncompatibleThreadStateException, InvocationException
在目标VM中调用此对象上指定的方法
。 指定的方法可以在此对象的类中,在该对象的类的超类中或在由该对象实现的接口中定义。 该方法可以是静态方法或实例方法,但不是静态初始化程序或构造函数。 使用ClassType.newInstance(com.sun.jdi.ThreadReference, com.sun.jdi.Method, java.util.List<? extends com.sun.jdi.Value>, int)
创建一个新对象并运行其构造函数。方法调用将发生在指定的线程中。 只有指定线程已被该线程中发生的事件挂起,才能进行方法调用。 当目标VM已通过悬浮不支持方法调用
VirtualMachine.suspend()
时,或者当指定的线程通过挂起ThreadReference.suspend()
。使用指定参数列表中的参数调用指定的方法。 方法调用是同步的 该方法直到被调用的方法在目标VM中返回才返回。 如果调用的方法抛出异常,则此方法将抛出一个
InvocationException
,其中包含抛出异常对象的镜像。对象参数必须与参数类型分配兼容(这意味着参数类型必须通过封闭类的加载器加载)。 原始参数必须是与参数类型兼容的分配,或必须可转换为参数类型而不会丢失信息。 如果被调用的方法接受可变数量的参数,则最后一个参数类型是某种组件类型的数组。 可以省略匹配位置中的参数,或者可以为null,相同组件类型的数组,或组件类型的参数,后跟任意数量的相同类型的其他参数。 如果省略参数,则传递组件类型的0长度数组。 组件类型可以是原始类型。 不支持自动装箱。 有关分配兼容性的更多信息,请参阅The Java™ Language Specification的 5.2节。
默认情况下,使用动态查找调用该方法,特别是The Java™ Language Specification的第15.12.4.4节所述, 将基于此
ObjectReference
镜像的对象的运行时类型进行覆盖。 可以通过在options
参数中指定INVOKE_NONVIRTUAL
位标志来更改此行为。 如果设置了此标志,则会调用指定的方法,无论该对象的运行时类型是否被覆盖。 在这种情况下,该方法必须具有在类或接口中的实现。 此选项对于执行方法调用非常有用,例如使用Java编程语言中的super
关键字完成的方法调用。默认情况下,如果先前被某个事件挂起,或者通过
VirtualMachine.suspend()
或ThreadReference.suspend()
,则在方法被调用的同时恢复目标VM中的所有线程。 这样做是为了防止如果任何线程拥有调用方法需要的监视器,将会发生死锁。 但是请注意,这个隐式恢复与ThreadReference.resume()
完全一致 ,因此如果线程的挂起计数大于1,则在调用期间它将保持处于挂起状态,从而仍然可能发生死锁。 默认情况下,当调用完成时,目标VM中的所有线程都将被暂停,而不管调用之前的状态如何。 在调用期间可能会发生断点或其他事件。 这可能会导致如上所述的死锁。 如果从客户端的事件处理程序线程调用invokeMethod,它也可能导致死锁。 在这种情况下,该线程将等待invokeMethod完成,并且不会读取新事件引入的EventSet。 如果这个新的EventSet是SUSPEND_ALL,那么会发生死锁,因为没有人会恢复EventSet。 为避免这种情况,在执行invokeMethod之前,应该禁用所有EventRequests,否则不应该从客户端的事件处理程序线程中完成invokeMethod。通过在
options
参数中指定INVOKE_SINGLE_THREADED
位标志可以防止在调用期间恢复其他线程; 然而,没有保护或恢复上述僵局,所以这个选择应该非常小心。 只有指定的线程将被恢复(如上面所有线程所述)。 完成单个线程调用后,调用线程将再次被挂起。 请注意,在调用完成时,单线程调用期间启动的任何线程都不会被挂起。如果目标VM在调用期间断开连接(例如,通过
VirtualMachine.dispose()
),方法调用将继续。- 参数
-
thread
- 要调用的线程。 -
method
- 要调用的方法
。 -
arguments
- 绑定到调用方法的Value
参数的列表。 列表中的值按照它们在方法签名中显示的顺序分配给参数。 -
options
- 整数位标志选项。 - 结果
-
一个
Value
镜像的调用方法的返回值。 - 异常
-
IllegalArgumentException
- 如果方法不是此对象的类的成员,如果参数列表的大小与方法的声明参数的数量不匹配,如果该方法是构造函数或静态初始化程序,或者如果指定了INVOKE_NONVIRTUAL
,方法是抽象的。 -
ClassNotLoadedException
- 如果任何参数类型尚未通过适当的类加载器加载。 -
IncompatibleThreadStateException
- 如果指定的线程未被事件挂起。 -
InvocationException
- 如果方法调用导致目标VM中的异常。 -
InvalidTypeException
- 如果参数不符合此要求 - 对象参数必须与参数类型兼容。 这意味着参数类型必须通过封闭类的加载器加载。 原始参数必须是与参数类型兼容的分配,或必须可转换为参数类型而不会丢失信息。 有关分配兼容性的更多信息,请参阅JLS第5.2节。 -
VMCannotBeModifiedException
- 如果VirtualMachine是只读的 - 请参阅VirtualMachine.canBeModified()
。
-
disableCollection
void disableCollection()
防止垃圾回收此对象。 默认情况下,JDI返回的所有ObjectReference
值都可以在目标VM运行的任何时间收集。 调用此方法可确保不会收集对象。enableCollection()
可以再次允许收集。对此方法的调用将被计数。 在重新启用垃圾回收之前,每次调用此方法都需要相应调用
enableCollection()
。请注意,当目标VM挂起时,不会发生垃圾回收,因为所有线程都被挂起。 暂停期间对变量,字段和数组的典型检查是安全的,没有明确禁用垃圾回收。
应该谨慎使用此方法,因为它会改变目标VM中垃圾收集的模式,因此可能导致调试器下的应用程序行为与其未调试的行为不同。
- 异常
-
VMCannotBeModifiedException
- 如果VirtualMachine是只读的 - 请 参阅VirtualMachine.canBeModified()
。
-
enableCollection
void enableCollection()
允许垃圾回收此对象。 默认情况下,JDI返回的所有ObjectReference
值都可以在目标VM运行的任何时间收集。 仅当以disableCollection()
禁用垃圾收集功能时,才需要调用此方法。- 异常
-
VMCannotBeModifiedException
- 如果VirtualMachine是只读的 - 请 参阅VirtualMachine.canBeModified()
。
-
isCollected
boolean isCollected()
确定此对象是否已在目标虚拟机中进行垃圾回收。- 结果
-
true
如果这个ObjectReference
已被收集;false
否则。 - 异常
-
VMCannotBeModifiedException
- 如果VirtualMachine是只读的,请 访问VirtualMachine.canBeModified()
。
-
uniqueID
long uniqueID()
返回此ObjectReference的唯一标识符。 它保证在来自尚未被处理的同一VM的所有ObjectReferences中是唯一的。 只要此ObjectReference尚未处理,该保证适用。- 结果
- 一个长独特的ID
-
waitingThreads
List<ThreadReference> waitingThreads() throws IncompatibleThreadStateException
返回一个列表,其中包含当前正在等待此对象的显示器的每个线程的ThreadReference
。 有关线程被认为正在等待监视器的信息,请参阅ThreadReference.currentContendedMonitor()
。并非所有目标虚拟机都支持此操作。 请参阅VirtualMachine#canGetMonitorInfo以确定是否支持该操作。
- 结果
-
一个
ThreadReference
个对象的列表。 如果没有线程正在等待显示器,该列表的长度为零。 - 异常
-
UnsupportedOperationException
- 如果目标VM不支持此操作。 -
IncompatibleThreadStateException
- 如果任何等待线程未暂停在目标VM中
-
owningThread
ThreadReference owningThread() throws IncompatibleThreadStateException
对于当前拥有该对象的监视器的线程(如果有的话)返回一个ThreadReference
。 有关所有权的定义,请参阅ThreadReference.ownedMonitors()
。并非所有目标虚拟机都支持此操作。 请参阅VirtualMachine#canGetMonitorInfo以确定是否支持该操作。
- 结果
-
目前拥有该监视器的
ThreadReference
,如果它是未知的,则为null。 - 异常
-
UnsupportedOperationException
- 如果目标VM不支持此操作。 -
IncompatibleThreadStateException
- 如果所有线程没有挂起在目标虚拟机中
-
entryCount
int entryCount() throws IncompatibleThreadStateException
返回此对象的显示器由当前拥有的线程输入的次数。 有关所有权的定义,请参阅ThreadReference.ownedMonitors()
。并非所有目标虚拟机都支持此操作。 请参阅VirtualMachine#canGetMonitorInfo以确定是否支持该操作。
- 结果
- 条目数的整数计数。
- 异常
-
UnsupportedOperationException
- 如果目标VM不支持此操作。 -
IncompatibleThreadStateException
- 如果拥有的线程没有暂停在目标VM中 - 另请参见:
-
owningThread()
-
referringObjects
List<ObjectReference> referringObjects(long maxReferrers)
返回直接引用此对象的对象。 只有返回垃圾收集目的可达的对象。 请注意,对象也可以以其他方式引用,例如从堆栈帧中的局部变量或JNI全局引用引用。 此方法不返回此类非对象引用。并非所有目标虚拟机都支持此操作。 使用
VirtualMachine.canGetInstanceInfo()
确定是否支持该操作。- 参数
-
maxReferrers
- 返回的引用对象的最大数量。 必须是非负数。 如果为零,则返回所有引用对象。 - 结果
-
一个
ObjectReference
对象的列表。 如果没有引用此对象的对象,则返回零长度列表。 - 异常
-
UnsupportedOperationException
- 如果目标虚拟机不支持此操作 - 请参阅canGetInstanceInfo()
-
IllegalArgumentException
- 如果maxReferrers小于零。 - 从以下版本开始:
- 1.6
- 另请参见:
-
VirtualMachine.instanceCounts(List)
,ReferenceType.instances(long)
-
equals
boolean equals(Object obj)
将指定的Object与此ObjectReference进行比较以获得相等性。- 重写:
-
equals
在Object
- 参数
-
obj
- 用于比较的参考对象。 - 结果
- 如果Object是ObjectReference,则为true,如果ObjectReferences属于同一个VM,并且如果在该VM中的镜像对象上应用“==”运算符,则该值为true。
- 另请参见:
-
Object.hashCode()
,HashMap
-
hashCode
int hashCode()
返回此ObjectReference的哈希码值。- 重写:
-
hashCode
在Object
- 结果
- 整数哈希码
- 另请参见:
-
Object.equals(java.lang.Object)
,System.identityHashCode(java.lang.Object)
-
-