Module jdk.jdi
Package com.sun.jdi

Interface InterfaceType

所有超级接口:
Accessible, Comparable<ReferenceType>, Mirror, ReferenceType, Type

public interface InterfaceType extends ReferenceType
目标虚拟机中接口的镜像。InterfaceType是对JLS中真实接口的细化定义的ReferenceType。接口类型永远不会被ObjectReference.referenceType()返回,但它可能在由该方法返回的ClassType的实现接口列表中。
自版本:
1.3
参见:
  • Method Details

    • superinterfaces

      List<InterfaceType> superinterfaces()
      获取直接由此接口扩展的接口。返回的列表仅包含此接口声明要扩展的接口。
      返回:
      一个InterfaceType对象列表,每个对象镜像一个由此接口扩展的接口。如果不存在,则返回一个长度为零的列表。
      抛出:
      ClassNotPreparedException - 如果此类尚未准备好。
    • subinterfaces

      List<InterfaceType> subinterfaces()
      获取当前准备好直接扩展此接口的接口。返回的列表仅包含声明此接口在其“extends”子句中的接口。
      返回:
      一个InterfaceType对象列表,每个对象镜像扩展此接口的接口。如果不存在,则返回一个长度为零的列表。
    • implementors

      List<ClassType> implementors()
      获取当前准备好直接实现此接口的类。返回的列表仅包含声明此接口在其“implements”子句中的类。
      返回:
      一个ClassType对象列表,每个对象镜像实现此接口的类。如果不存在,则返回一个长度为零的列表。
    • invokeMethod

      default Value invokeMethod(ThreadReference thread, Method method, List<? extends Value> arguments, int options) throws InvalidTypeException, ClassNotLoadedException, IncompatibleThreadStateException, InvocationException
      在目标虚拟机中调用指定的静态Method。指定的方法必须在此接口中定义。该方法必须是静态方法,但不能是静态初始化程序。

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

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

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

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

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

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

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