Module jdk.jdi
Package com.sun.jdi

Interface ClassType

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

public interface ClassType extends ReferenceType
目标虚拟机中类的镜像。ClassType是对JLS定义中真实类的一种细化,不是接口,也不是数组类型。任何镜像了此类的实例的ObjectReference将以ClassType作为其类型。
自版本:
1.3
参见:
  • Field Details

    • INVOKE_SINGLE_THREADED

      static final int INVOKE_SINGLE_THREADED
      仅使用调用线程执行方法调用
      参见:
  • Method Details

    • superclass

      ClassType superclass()
      获取此类的超类。
      返回:
      一个在目标虚拟机中镜像此类的超类的ClassType。如果不存在这样的类,则返回null。
    • interfaces

      List<InterfaceType> interfaces()
      获取此类直接实现的接口。仅包括在此类中使用"implements"关键字声明的接口。
      返回:
      一个InterfaceType对象列表,每个对象在目标虚拟机中镜像此ClassType的直接接口。如果不存在,则返回一个长度为零的列表。
      抛出:
      ClassNotPreparedException - 如果此类尚未准备好。
    • allInterfaces

      List<InterfaceType> allInterfaces()
      获取此类直接和间接实现的接口。interfaces()返回的接口以及所有超级接口也会被返回。
      返回:
      一个InterfaceType对象列表,每个对象在目标虚拟机中镜像此ClassType的接口。如果不存在,则返回一个长度为零的列表。
      抛出:
      ClassNotPreparedException - 如果此类尚未准备好。
    • subclasses

      List<ClassType> subclasses()
      获取此类当前加载的直接子类。此列表的顺序不保证。
      返回:
      一个ClassType对象列表,每个对象在目标虚拟机中镜像此类的已加载子类。如果不存在这样的类,则此方法返回一个长度为零的列表。
    • isEnum

      boolean isEnum()
      确定此类是否声明为枚举。
      返回:
      如果此类声明为枚举,则返回true;否则返回false。
    • setValue

      void setValue(Field field, Value value) throws InvalidTypeException, ClassNotLoadedException
      为静态字段赋值。Field必须对此ClassType有效;即,它必须来自镜像对象的类或该类的超类。字段不能是final的。

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

      参数:
      field - 要设置的字段。
      value - 要分配的值。
      抛出:
      IllegalArgumentException - 如果字段不是静态的,字段是final的,或字段在此类中不存在。
      ClassNotLoadedException - 如果字段类型尚未通过适当的类加载器加载。
      InvalidTypeException - 如果值的类型与字段的声明类型不匹配。
      VMCannotBeModifiedException - 如果VirtualMachine是只读的 - 请参阅VirtualMachine.canBeModified()
    • invokeMethod

      Value invokeMethod(ThreadReference thread, Method method, List<? extends Value> arguments, int options) throws InvalidTypeException, ClassNotLoadedException, IncompatibleThreadStateException, InvocationException
      在目标虚拟机中调用指定的静态Method。指定的方法可以在此类中定义,也可以在超类中定义。方法必须是静态方法,但不能是静态初始化程序。使用newInstance(com.sun.jdi.ThreadReference, com.sun.jdi.Method, java.util.List<? extends com.sun.jdi.Value>, int)来创建一个新对象并运行其构造函数。

      方法调用将在指定线程中发生。只有在指定线程被该线程中发生的事件暂停后,方法调用才能发生。当目标虚拟机通过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参数中指定INVOKE_SINGLE_THREADED位标志来阻止在调用期间恢复其他线程;但是,对于上述死锁没有保护或恢复,因此应谨慎使用此选项。只有指定的线程将被恢复(如上述所有线程)。在单线程调用完成后,调用线程将再次被暂停。请注意,在单线程调用期间启动的任何线程在调用完成时不会被暂停。

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

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

      使用目标VM中给定的构造函数Method构造此类型的新实例。指定的构造函数必须在此类中定义。

      实例创建将在指定的线程中发生。只有在指定线程已被在该线程中发生的事件挂起时,才能发生实例创建。当目标VM通过VirtualMachine.suspend()或指定线程通过ThreadReference.suspend()挂起时,不支持实例创建。

      使用指定的构造函数以指定的参数列表调用。调用是同步的;此方法在构造函数在目标VM中返回之前不会返回。如果被调用方法抛出异常,则此方法将抛出包含抛出的异常对象镜像的InvocationException

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

      默认情况下,在调用方法时,如果之前被事件或VirtualMachine.suspend()ThreadReference.suspend()挂起的所有线程将被恢复。这样做是为了防止任何线程拥有被调用方法所需的监视器而导致死锁。在调用期间可能会发生断点或其他事件。但是,请注意,此隐式恢复的行为与ThreadReference.resume()完全相同,因此如果线程的挂起计数大于1,则在调用期间它将保持挂起状态。默认情况下,当调用完成时,目标VM中的所有线程都将被挂起,而不管它们在调用之前的状态如何。

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

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

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

      Method concreteMethodByName(String name, String signature)
      返回此类中可见的具有给定名称和签名的单个非抽象Method。有关签名格式的信息,请参见ReferenceType.methodsByName(java.lang.String, java.lang.String)

      返回的方法(如果非空)是ClassType的一个组成部分。

      参数:
      name - 要查找的方法的名称。
      signature - 要查找的方法的签名。
      返回:
      与给定名称和签名匹配的Method,如果没有匹配则返回null
      抛出:
      ClassNotPreparedException - 如果方法尚不可用,因为类尚未准备好。
      参见: