-
- All Superinterfaces:
-
Accessible
,Comparable<ReferenceType>
,Mirror
,ReferenceType
,Type
public interface ClassType extends ReferenceType
目标VM中的类的镜像。 ClassType是一个ReferenceType
的改进,适用于定义中JLS意义上的真类(不是接口,而不是数组类型)。 任何反映这种类的实例的ObjectReference
将具有ClassType作为其类型。- 从以下版本开始:
- 1.3
- 另请参见:
-
ObjectReference
-
-
Field Summary
Fields Modifier and Type Field 描述 static int
INVOKE_SINGLE_THREADED
仅执行调用线程执行方法调用
-
方法摘要
所有方法 接口方法 抽象方法 Modifier and Type 方法 描述 List<InterfaceType>
allInterfaces()
获取由此类直接和间接实现的接口。方法
concreteMethodByName(String name, String signature)
返回从该类可见的具有给定名称和签名的单个非抽象方法
。List<InterfaceType>
interfaces()
获取由此类直接实现的接口。Value
invokeMethod(ThreadReference thread, 方法 method, List<? extends Value> arguments, int options)
在目标虚拟机中调用指定的静态方法
。boolean
isEnum()
确定这个类是否被声明为一个枚举。ObjectReference
newInstance(ThreadReference thread, 方法 method, List<? extends Value> arguments, int options)
构造此类型的新实例,使用给定的构造方法
目标VM。void
setValue(Field field, Value value)
为静态字段分配一个值。List<ClassType>
subclasses()
获取此类的当前加载的直接子类。ClassType
superclass()
获取此类的超类。-
Methods inherited from interface com.sun.jdi.Accessible
isPackagePrivate, isPrivate, isProtected, isPublic, modifiers
-
Methods inherited from interface java.lang.Comparable
compareTo
-
Methods inherited from interface com.sun.jdi.Mirror
toString, virtualMachine
-
Methods inherited from interface com.sun.jdi.ReferenceType
allFields, allLineLocations, allLineLocations, allMethods, availableStrata, classLoader, classObject, constantPool, constantPoolCount, defaultStratum, equals, failedToInitialize, fieldByName, fields, genericSignature, getValue, getValues, hashCode, instances, isAbstract, isFinal, isInitialized, isPrepared, isStatic, isVerified, locationsOfLine, locationsOfLine, majorVersion, methods, methodsByName, methodsByName, minorVersion, module, name, nestedTypes, sourceDebugExtension, sourceName, sourceNames, sourcePaths, visibleFields, visibleMethods
-
-
-
-
字段详细信息
-
INVOKE_SINGLE_THREADED
static final int INVOKE_SINGLE_THREADED
仅执行调用线程执行方法调用- 另请参见:
- Constant Field Values
-
-
方法详细信息
-
interfaces
List<InterfaceType> interfaces()
获取由此类直接实现的接口。 只有包含在该类中使用“implements”关键字声明的接口。- 结果
-
一个
InterfaceType
对象的列表,每个镜像目标VM中直接接口此ClassType。 如果不存在,返回零长度列表。 - 异常
-
ClassNotPreparedException
- 如果这个课程尚未准备好
-
allInterfaces
List<InterfaceType> allInterfaces()
获取由此类直接和间接实现的接口。 返回的接口返回interfaces()
以及所有超级接口。- 结果
-
每个镜像目标VM中此ClassType的接口的
InterfaceType
对象的列表。 如果不存在,返回零长度列表。 - 异常
-
ClassNotPreparedException
- 如果这个课程尚未准备好
-
isEnum
boolean isEnum()
确定这个类是否被声明为一个枚举。- 结果
-
true
如果这个类被声明为一个枚举; 否则为假。
-
setValue
void setValue(Field field, Value value) throws InvalidTypeException, ClassNotLoadedException
为静态字段分配一个值。Field
必须对此ClassType有效; 也就是说,它必须来自镜像对象的类或该类的超类。 该领域不能是最终的。对象值必须与字段类型分配兼容(这意味着字段类型必须通过封装类的加载器加载)。 原始值必须与字段类型兼容,或必须可转换为字段类型,而不会丢失信息。 有关分配兼容性的更多信息,请参阅JLS第5.2节。
- 参数
-
field
- 要设置的字段。 -
value
- 要分配的值。 - 异常
-
IllegalArgumentException
- 如果该字段不是静态的,该字段是final,或该类不存在该字段。 -
ClassNotLoadedException
- 如果字段类型尚未通过适当的类加载器加载。 -
InvalidTypeException
- 如果值的类型与字段的声明类型不匹配。 -
VMCannotBeModifiedException
- 如果VirtualMachine是只读的 - 请参阅VirtualMachine.canBeModified()
。
-
invokeMethod
Value invokeMethod(ThreadReference thread, 方法 method, List<? extends Value> arguments, int options) throws InvalidTypeException, ClassNotLoadedException, IncompatibleThreadStateException, InvocationException
在目标虚拟机中调用指定的静态方法
。 指定的方法可以在此类中定义,也可以在超类中定义。 该方法必须是静态方法,而不是静态初始化程序。 使用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节。
默认情况下,如果方法被先前被事件挂起,或者由
VirtualMachine.suspend()
或ThreadReference.suspend()
暂停,那么将重新启动目标虚拟机中的所有线程。 这样做是为了防止如果任何线程拥有调用方法需要的监视器,将会发生死锁。 但是请注意,这个隐式的恢复与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
- 如果方法不是此类或超类的成员,如果参数列表的大小与方法的声明参数的数量不匹配,或者方法是初始化程序,构造函数或静态初始化程序。 -
ClassNotLoadedException
- 如果任何参数类型尚未通过适当的类加载器加载。 -
IncompatibleThreadStateException
- 如果指定的线程未被事件挂起。 -
InvocationException
- 如果方法调用导致目标VM中的异常。 -
InvalidTypeException
- 如果参数不符合此要求 - 对象参数必须与参数类型兼容。 这意味着参数类型必须通过封装类'类加载器加载。 原始参数必须是与参数类型兼容的分配,或必须可转换为参数类型而不会丢失信息。 有关分配兼容性的更多信息,请参阅JLS第5.2节。 -
VMCannotBeModifiedException
- 如果VirtualMachine是只读的 - 请参阅VirtualMachine.canBeModified()
。
-
newInstance
ObjectReference newInstance(ThreadReference thread, 方法 method, List<? extends Value> arguments, int options) throws InvalidTypeException, ClassNotLoadedException, IncompatibleThreadStateException, InvocationException
构造此类型的新实例,使用给定的构造方法
目标VM。 指定的构造函数必须在此类中定义。实例创建将发生在指定的线程中。 只有当指定的线程已被该线程中发生的事件挂起时,才能执行实例创建。 当目标VM已通过暂停不支持实例创建
VirtualMachine.suspend()
或在指定的线程通过暂停ThreadReference.suspend()
。使用指定参数列表中的参数调用指定的构造函数。 调用是同步的 该方法直到构造函数在目标VM中返回为止。 如果调用的方法抛出异常,此方法将抛出一个
InvocationException
,其中包含抛出异常对象的镜像。对象参数必须与参数类型分配兼容(这意味着参数类型必须通过封装类的加载器加载)。 原始参数必须是与参数类型兼容的分配,或必须可转换为参数类型而不会丢失信息。 如果被调用的方法接受可变数量的参数,则最后一个参数类型是某种组件类型的数组。 可以省略匹配位置中的参数,或者可以为null,相同组件类型的数组或组件类型的参数,后跟任何数量的相同类型的其他参数。 如果省略参数,则传递组件类型的0长度数组。 组件类型可以是原始类型。 不支持自动装箱。 有关分配兼容性的更多信息,请参见The Java™ Language Specification的 5.2节。
默认情况下,如果事件先前被某个事件挂起,或
VirtualMachine.suspend()
或ThreadReference.suspend()
,则该方法将被调用,则目标VM中的所有线程都将被恢复。 这样做是为了防止如果任何线程拥有调用方法需要的监视器,将会发生死锁。 在调用期间可能会发生断点或其他事件。 但是请注意,这个隐式恢复与ThreadReference.resume()
完全一致 ,因此如果该线程的挂起计数大于1,则在调用期间它将保持暂停状态。 默认情况下,当调用完成时,目标VM中的所有线程都将被暂停,而不管调用之前的状态如何。可以通过在
options
参数中指定INVOKE_SINGLE_THREADED
位标志来防止在调用期间恢复其他线程; 然而,没有保护或恢复上述僵局,所以这个选择应该非常小心。 只有指定的线程将被恢复(如上面所有线程所述)。 完成单个线程调用后,调用线程将再次被挂起。 请注意,在调用完成时,单线程调用期间启动的任何线程都不会被挂起。如果目标VM在调用期间断开连接(例如,通过
VirtualMachine.dispose()
),方法调用将继续。- 参数
-
thread
- 要调用的线程。 -
method
- 要调用的构造函数方法
。 -
arguments
- 绑定到被调用的构造函数的Value
参数的列表。 列表中的值按照它们在构造函数签名中出现的顺序分配给参数。 -
options
- 整数位标志选项。 - 结果
-
一个
ObjectReference
镜像的新创建的对象。 - 异常
-
IllegalArgumentException
- 如果方法不是此类的成员,如果参数列表的大小与构造函数的已声明参数的数量不匹配,或者该方法不是构造函数。 -
ClassNotLoadedException
- 如果任何参数类型尚未通过适当的类加载器加载。 -
IncompatibleThreadStateException
- 如果指定的线程未被事件挂起。 -
InvocationException
- 如果方法调用导致目标VM中的异常。 -
InvalidTypeException
- 如果参数不符合此要求 - 对象参数必须与参数类型兼容。 这意味着参数类型必须通过封装类'类加载器加载。 原始参数必须是与参数类型兼容的分配,或必须可转换为参数类型而不会丢失信息。 有关分配兼容性的更多信息,请参阅JLS第5.2节。 -
VMCannotBeModifiedException
- 如果VirtualMachine是只读的 - 请参阅VirtualMachine.canBeModified()
。
-
concreteMethodByName
方法 concreteMethodByName(String name, String signature)
返回从该类可见的具有给定名称和签名的单个非抽象的27044498881730306 。 有关签名格式的信息,请参阅ReferenceType.methodsByName(java.lang.String, java.lang.String)
。返回的方法(如果非空)是
ClassType
的组件。- 参数
-
name
- 要查找的方法的名称。 -
signature
- 方法的签名查找 - 结果
-
该
方法
匹配给定的名称和签名或null
,如果没有匹配。 - 异常
-
ClassNotPreparedException
- 如果方法尚未可用,因为类尚未准备好。 - 另请参见:
-
ReferenceType.visibleMethods()
,ReferenceType.methodsByName(java.lang.String name)
,ReferenceType.methodsByName(java.lang.String name, java.lang.String signature)
-
-