Module jdk.jdi
Package com.sun.jdi

Interface ObjectReference

所有超接口:
Mirror, Value
所有已知子接口:
ArrayReference, ClassLoaderReference, ClassObjectReference, ModuleReference, StringReference, ThreadGroupReference, ThreadReference

public interface ObjectReference extends Value
目前存在于目标VM中的对象。ObjectReference仅反映对象本身,不特定于当前分配给其的任何Field或LocalVariable。ObjectReference可以从字段和/或变量中具有0个或多个引用。

任何直接或间接以ObjectReference作为参数的ObjectReference上的方法,如果目标VM断开连接并且VMDisconnectEvent已被读取或可从EventQueue中读取,则可能会抛出VMDisconnectedException。

任何直接或间接以ObjectReference作为参数的ObjectReference上的方法,如果目标VM已耗尽内存,则可能会抛出VMOutOfMemoryException。

任何直接或间接以ObjectReference作为参数的ObjectReference上的方法,如果反映的对象已被垃圾回收,则可能会抛出ObjectCollectedException。

自版本:
1.3
  • Field Details

    • INVOKE_SINGLE_THREADED

      static final int INVOKE_SINGLE_THREADED
      仅恢复调用线程的方法调用
      参见:
    • INVOKE_NONVIRTUAL

      static final int INVOKE_NONVIRTUAL
      执行非虚方法调用
      参见:
  • Method Details

    • 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)
      获取此对象中给定实例或静态字段的值。Field必须对于此ObjectReference有效;即,它必须来自反映对象的类或该类的超类。
      参数:
      sig - 包含请求值的字段
      返回:
      实例字段的Value。
      抛出:
      IllegalArgumentException - 如果该字段对于此对象的类无效。
    • getValues

      Map<Field,Value> getValues(List<? extends Field> fields)
      获取此对象中多个实例和/或静态字段的值。这些字段必须对于此ObjectReference有效;即,它们必须来自反映对象的类或该类的超类。
      参数:
      fields - 包含请求值的Field对象列表
      返回:
      包含请求的Field对象及其Value的Map。
      抛出:
      IllegalArgumentException - 如果任何字段对于此对象的类无效。
    • setValue

      void setValue(Field field, Value value) throws InvalidTypeException, ClassNotLoadedException
      设置此对象中给定实例或静态字段的值。Field必须对于此ObjectReference有效;即,它必须来自反映对象的类或该类的超类。该字段不能是final。

      对象值必须与字段类型兼容(这意味着字段类型必须通过封闭类的类加载器加载)。原始值必须与字段类型兼容,或者必须可以将原始值转换为字段类型而不会丢失信息。有关赋值兼容性的更多信息,请参阅《Java语言规范》第5.2节。

      参数:
      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, int)创建一个新对象并运行其构造函数。

      方法调用将在指定的线程中发生。只有在指定线程已被该线程中发生的事件暂停时,方法调用才能发生。当目标虚拟机通过VirtualMachine.suspend()暂停或指定线程通过ThreadReference.suspend()暂停时,不支持方法调用。

      指定的方法将使用指定参数列表中的参数调用。方法调用是同步的;在目标虚拟机中调用的方法返回之前,此方法不会返回。如果调用的方法引发异常,则此方法将抛出一个包含引发的异常对象的InvocationException

      对象参数必须与参数类型兼容(这意味着参数类型必须通过封闭类的类加载器加载)。原始参数必须与参数类型兼容,或者必须可以在不丢失信息的情况下转换为参数类型。如果被调用的方法接受可变数量的参数,则最后一个参数类型是某种组件类型的数组。匹配位置的参数可以省略,或者可以是null,相同组件类型的数组,或者是组件类型的参数,后跟任意数量的相同类型的其他参数。如果省略参数,则传递长度为0的组件类型数组。组件类型可以是原始类型。不支持自动装箱。有关赋值兼容性的更多信息,请参见《Java语言规范》第5.2节。

      默认情况下,方法将使用动态查找调用,如《Java语言规范》第15.12.4.4节中所述,特别是基于此ObjectReference镜像的对象的运行时类型进行覆盖。可以通过在options参数中指定INVOKE_NONVIRTUAL位标志来更改此行为。如果设置了此标志,则无论此方法是否针对此对象的运行时类型进行了覆盖,都将调用指定的方法。在这种情况下,该方法必须具有实现,可以是在类中或接口中。此选项对执行类似于Java编程语言中使用super关键字的方法调用很有用。

      默认情况下,在调用方法时,如果之前由事件或VirtualMachine.suspend()ThreadReference.suspend()暂停了所有线程,则所有线程都将恢复。这样做是为了防止发生死锁,因为任何线程都拥有被调用方法所需的监视器。但是,请注意,此隐式恢复的行为与ThreadReference.resume()完全相同,因此,如果线程的暂停计数大于1,则在调用期间它将保持暂停状态,因此仍然可能发生死锁。默认情况下,当调用完成时,目标虚拟机中的所有线程都将被暂停,而不管它们在调用之前的状态如何。在调用期间可能会发生断点或其他事件。这可能会导致如上所述的死锁。如果从客户端的事件处理程序线程调用invokeMethod,也可能会导致死锁。在这种情况下,此线程将等待invokeMethod完成,并且不会读取新事件的EventSet。如果此新EventSet是SUSPEND_ALL,则将发生死锁,因为没有人会恢复EventSet。为避免这种情况,应在执行invokeMethod之前禁用所有EventRequests,或者不应该从客户端的事件处理程序线程执行invokeMethod。

      在调用期间,可以通过在options参数中指定INVOKE_SINGLE_THREADED位标志来防止其他线程的恢复;但是,对于上述死锁没有保护或恢复,因此应谨慎使用此选项。只有指定的线程将被恢复(如上所述的所有线程)。在单线程调用完成后,调用线程将再次被暂停。请注意,在单线程调用期间启动的任何线程在调用完成时不会被暂停。

      如果在调用期间断开目标虚拟机(例如,通过VirtualMachine.dispose()),则方法调用将继续。

      参数:
      thread - 要调用的线程。
      method - 要调用的Method
      arguments - 绑定到调用方法的Value参数列表。列表中的值按照它们在方法签名中出现的顺序分配给参数。
      options - 整数位标志选项。
      返回:
      调用方法的返回值的Value镜像。
      抛出:
      IllegalArgumentException - 如果该方法不是此对象类的成员,如果参数列表的大小与方法的声明参数数量不匹配,如果该方法是构造函数或静态初始化程序,或者如果指定了INVOKE_NONVIRTUAL并且该方法是抽象的。
      ClassNotLoadedException - 如果任何参数类型尚未通过适当的类加载器加载。
      IncompatibleThreadStateException - 如果指定的线程尚未被事件暂停。
      InvocationException - 如果方法调用导致目标虚拟机中的异常。
      InvalidTypeException - 如果参数不符合此要求 - 对象参数必须与参数类型兼容。这意味着参数类型必须通过封闭类的类加载器加载。原始参数必须与参数类型兼容,或者必须可以在不丢失信息的情况下转换为参数类型。有关赋值兼容性的更多信息,请参见JLS第5.2节。
      VMCannotBeModifiedException - 如果VirtualMachine是只读的 - 请参见VirtualMachine.canBeModified()
    • disableCollection

      void disableCollection()
      防止此对象被垃圾回收。默认情况下,JDI返回的所有ObjectReference值都可能在目标虚拟机运行时的任何时候被回收。调用此方法可保证对象不会被回收。可以使用enableCollection()再次允许收集。

      对此方法的调用是计数的。每次调用此方法都需要在重新启用垃圾回收之前对应调用enableCollection()

      请注意,在目标虚拟机暂停时,不会发生垃圾回收,因为所有线程都被暂停。在暂停期间进行的变量、字段和数组的典型检查是安全的,而无需显式禁用垃圾回收。

      应谨慎使用此方法,因为它会改变目标虚拟机中的垃圾回收模式,因此可能导致在调试器下应用程序行为与非调试行为不同。

      抛出:
      VMCannotBeModifiedException - 如果VirtualMachine是只读 - 请参见VirtualMachine.canBeModified()
    • enableCollection

      void enableCollection()
      允许此对象进行垃圾回收。默认情况下,JDI返回的所有ObjectReference值都可能在目标虚拟机运行时的任何时候被回收。只有在先前使用disableCollection()禁用了垃圾回收时,才需要调用此方法。
      抛出:
      VMCannotBeModifiedException - 如果VirtualMachine是只读 - 请参见VirtualMachine.canBeModified()
    • isCollected

      boolean isCollected()
      确定此对象是否在目标虚拟机中已被垃圾回收。
      返回:
      如果此ObjectReference已被回收,则返回true;否则返回false
      抛出:
      VMCannotBeModifiedException - 如果VirtualMachine是只读 - 请参见VirtualMachine.canBeModified()
    • uniqueID

      long uniqueID()
      返回此ObjectReference的唯一标识符。在尚未被处理的相同VM中,此ObjectReference的唯一性是有保证的。只要此ObjectReference尚未被处理,此保证就适用。
      返回:
      一个长唯一ID
    • waitingThreads

      返回一个List,其中包含每个当前等待此对象监视器的线程的ThreadReference。有关线程何时被视为等待监视器的信息,请参见ThreadReference.currentContendedMonitor()

      并非所有目标VM都支持此操作。请查看VirtualMachine#canGetMonitorInfo以确定是否支持该操作。

      返回:
      一个包含ThreadReference对象的List。如果没有线程等待监视器,则列表长度为零。
      抛出:
      UnsupportedOperationException - 如果目标VM不支持此操作。
      IncompatibleThreadStateException - 如果任何等待线程在目标VM中未挂起
    • owningThread

      返回一个线程的ThreadReference,如果有的话,当前拥有此对象监视器的线程。请参见ThreadReference.ownedMonitors()以了解所有权的定义。

      并非所有目标VM都支持此操作。请查看VirtualMachine#canGetMonitorInfo以确定是否支持该操作。

      返回:
      当前拥有监视器的ThreadReference,如果未拥有则返回null。
      抛出:
      UnsupportedOperationException - 如果目标VM不支持此操作。
      IncompatibleThreadStateException - 如果拥有线程在目标VM中未挂起
    • entryCount

      int entryCount() throws IncompatibleThreadStateException
      返回当前拥有线程进入此对象监视器的次数。请参见ThreadReference.ownedMonitors()以了解所有权的定义。

      并非所有目标VM都支持此操作。请查看VirtualMachine#canGetMonitorInfo以确定是否支持该操作。

      返回:
      进入次数的整数计数。
      抛出:
      UnsupportedOperationException - 如果目标VM不支持此操作。
      IncompatibleThreadStateException - 如果拥有线程在目标VM中未挂起
      另请参见:
    • referringObjects

      List<ObjectReference> referringObjects(long maxReferrers)
      返回直接引用此对象的对象。仅返回可达以进行垃圾回收的对象。请注意,对象也可以以其他方式引用,例如从堆栈帧中的局部变量引用,或从JNI全局引用引用。此类非对象引用不会被此方法返回。

      并非所有目标虚拟机都支持此操作。使用VirtualMachine.canGetInstanceInfo()来确定是否支持该操作。

      参数:
      maxReferrers - 要返回的引用对象的最大数量。必须为非负数。如果为零,则返回所有引用对象。
      返回:
      一个包含ObjectReference对象的List。如果没有引用此对象的对象,则返回一个长度为零的列表。
      抛出:
      UnsupportedOperationException - 如果目标虚拟机不支持此操作 - 请参见canGetInstanceInfo()
      IllegalArgumentException - 如果maxReferrers小于零。
      自:
      1.6
      另请参见:
    • equals

      boolean equals(Object obj)
      将指定的Object与此ObjectReference进行比较以确定是否相等。
      覆盖:
      equals 在类 Object
      参数:
      obj - 要比较的引用对象。
      返回:
      如果Object是ObjectReference,如果ObjectReferences属于同一VM,并且在该VM中对镜像对象应用"=="运算符的结果为true,则返回true。
      另请参见:
    • hashCode

      int hashCode()
      返回此ObjectReference的哈希码值。
      覆盖:
      hashCode 在类 Object
      返回:
      整数哈希码
      另请参见: