模块  jdk.jdi
软件包  com.sun.jdi

Interface ObjectReference

    • 字段详细信息

      • 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!");

        obj的ReferenceType将镜像java.lang.String而不是java.lang.Object。

        对象的类型永远不会更改,因此此方法将始终在镜像对象的生命周期内返回相同的ReferenceType。

        返回的ReferenceType将是ClassTypeArrayType而不是InterfaceType

        结果
        这个对象的ReferenceType
      • getValue

        Value getValue​(字段 sig)
        获取此对象中给定实例或静态字段的值。 Field必须对此ObjectReference有效; 也就是说,它必须来自镜像对象的类或该类的超类。
        参数
        sig - 包含请求值的字段
        结果
        实例字段的Value
        异常
        IllegalArgumentException - 如果该字段对此对象的类无效。
      • getValues

        Map<字段,​Value> getValues​(List<? extends 字段> fields)
        获取此对象中多个实例和/或静态字段的值。 Fields必须对此ObjectReference有效; 也就是说,它们必须来自镜像对象的类或该类的超类。
        参数
        字段 - 包含请求值的字段对象的列表。
        结果
        请求的字段对象的地图及其Value
        异常
        IllegalArgumentException - 如果任何字段对此对象的类无效。
      • setValue

        void setValue​(字段 field,
                      Value value)
               throws InvalidTypeException,
                      ClassNotLoadedException
        设置此对象中给定实例或静态字段的值。 字段必须对此ObjectReference有效; 也就是说,它必须来自镜像对象的类或该类的超类。 如果是静态的,则该字段不得为final。

        对象值必须与字段类型兼容(这意味着必须通过封闭类的类加载器加载字段类型)。 原始值必须是与字段类型兼容的赋值,或者必须可转换为字段类型而不会丢失信息。 有关分配兼容性的更多信息,请参见The Java™ Language Specification的 5.2节。

        参数
        字段 - 包含请求值的字段
        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()
        防止此对象的垃圾回收。 默认情况下,可以在目标VM运行的任何时间收集JDI返回的所有ObjectReference值。 对此方法的调用可确保不会收集该对象。 enableCollection()可用于再次允许收集。

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

        请注意,虽然目标VM已挂起,但不会发生任何垃圾回收,因为所有线程都已挂起。 暂停期间对变量,字段和数组的典型检查是安全的,无需显式禁用垃圾回收。

        应该谨慎使用此方法,因为它会改变目标VM中的垃圾收集模式,因此可能导致调试器下的应用程序行为与其未调试的行为不同。

        异常
        VMCannotBeModifiedException - 如果VirtualMachine是只读的 - 请 参阅VirtualMachine.canBeModified()
      • uniqueID

        long uniqueID()
        返回此ObjectReference的唯一标识符。 它保证在来自同一VM的所有尚未处置的ObjectReferences中是唯一的。 只要尚未处理此ObjectReference,保证就适用。
        结果
        一个很长的唯一ID
      • equals

        boolean equals​(Object obj)
        将指定的Object与此ObjectReference进行比较以获得相等性。
        重写:
        equals在类 Object
        参数
        obj - 要与之比较的引用对象。
        结果
        如果Object是ObjectReference,则为true;如果ObjectReferences属于同一VM,并且在该VM中的镜像对象上应用“==”运算符,则求值为true。
        另请参见:
        Object.hashCode()HashMap