Module jdk.jdi
Package com.sun.jdi

Interface ReferenceType

所有超级接口:
Accessible, Comparable<ReferenceType>, Mirror, Type
所有已知子接口:
ArrayType, ClassType, InterfaceType

public interface ReferenceType extends Type, Comparable<ReferenceType>, Accessible
对象在目标VM中的类型。ReferenceType包括类、接口和数组类型,如《Java语言规范》中定义。所有ReferenceType对象都属于以下子接口之一:ClassType 用于类,InterfaceType 用于接口,ArrayType 用于数组。请注意,原始类(例如,Integer.TYPEreflected type)被表示为ClassType。VM为所有三者创建Class对象,因此从VM的角度看,每个ReferenceType映射到一个不同的Class对象。

可以通过查询特定的ObjectReference的类型或从VirtualMachine获取所有引用类型的列表来获取ReferenceTypes。

ReferenceType提供对静态类型信息(如方法和字段)的访问,并提供对动态类型信息(如相应的Class对象和类加载器)的访问。

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

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

任何直接或间接以ReferenceType作为参数的ReferenceType上的方法,如果镜像类型已被卸载,则可能会抛出ObjectCollectedException

自:
1.3
参见:
  • Method Details

    • name

      String name()
      返回此ReferenceType对象的名称。返回的名称与Class.getName()返回的名称形式相同。
      指定者:
      name 在接口 Type
      返回:
      包含类型名称的字符串。
      参见:
    • genericSignature

      String genericSignature()
      获取此类型的通用签名(如果有)。通用签名在《Java虚拟机规范》中有描述。
      返回:
      包含通用签名的字符串,如果没有通用签名则返回null
      自:
      1.5
    • classLoader

      ClassLoaderReference classLoader()
      获取加载与此类型对应的类的类加载器对象。
      返回:
      一个反映类加载器的ClassLoaderReference,如果类是通过引导类加载器加载的,则返回null
    • module

      default ModuleReference module()
      获取包含与此类型对应的类的模块对象。并非所有目标虚拟机都支持此操作。使用VirtualMachine.canGetModuleInfo()来确定是否支持该操作。
      实现要求:
      默认实现会抛出 UnsupportedOperationException 异常。
      返回:
      一个ModuleReference,它反映了目标虚拟机中的模块。
      抛出:
      UnsupportedOperationException - 如果目标虚拟机不支持此操作。
      自 JDK 版本:
      9
    • sourceName

      String sourceName() throws AbsentInformationException
      获取与此类型声明对应的源代码的标识名称。对该字符串的解释由源代码存储库机制负责。

      返回的名称取决于虚拟机的默认层次结构(VirtualMachine.getDefaultStratum())。在参考实现中,当使用基本层次结构时,返回的字符串是包含此类型声明的源文件的未限定名称。在其他层次结构中,返回的源名称是该层次结构的第一个源名称。由于其他语言可能对引用类型有多个源名称,因此建议使用Location.sourceName()sourceNames(String)

      对于数组(ArrayType)和原始类,始终会抛出 AbsentInformationException 异常。

      返回:
      字符串源文件名称
      抛出:
      AbsentInformationException - 如果源名称未知
    • sourceNames

      List<String> sourceNames(String stratum) throws AbsentInformationException
      获取与此类型声明对应的所有源代码的标识名称。对这些名称的解释由源代码存储库机制负责。

      返回的名称是针对指定的层次结构(请参阅Location以获取层次结构的描述)。在参考实现中,当使用 Java 编程语言层次结构时,返回的 List 包含一个元素:一个字符串,即包含此类型声明的源文件的未限定名称。在其他层次结构中,返回的源名称是该层次结构定义的所有源名称。

      参数:
      stratum - 要从中检索信息的层次结构,或者为声明类型的默认层次结构使用 null
      返回:
      一个 String 对象列表,每个对象代表一个源名称
      抛出:
      AbsentInformationException - 如果源名称未知。

      对于数组(ArrayType)和原始类,始终会抛出 AbsentInformationException 异常。

      自 JDK 版本:
      1.4
    • sourcePaths

      List<String> sourcePaths(String stratum) throws AbsentInformationException
      获取与此类型声明对应的源代码的路径。对这些路径的解释由源代码存储库机制负责。

      返回的路径是针对指定的层次结构(请参阅Location以获取层次结构的描述)。在参考实现中,对于未明确指定源路径的层次结构(Java 编程语言层次结构永远不会这样做),返回的字符串是由将此 ReferenceType 的包名转换为平台相关路径后再加上sourceNames(String)前缀的字符串。例如,在 Windows 平台上,java.lang.Thread 将返回一个包含一个元素的列表:"java\lang\Thread.java"

      参数:
      stratum - 要从中检索信息的层次结构,或者为声明类型的默认层次结构使用 null
      返回:
      一个 String 对象列表,每个对象代表一个源路径
      抛出:
      AbsentInformationException - 如果源名称未知。

      对于数组(ArrayType)和原始类,始终会抛出 AbsentInformationException 异常。

      自 JDK 版本:
      1.4
    • sourceDebugExtension

      String sourceDebugExtension() throws AbsentInformationException
      获取此类型的源代码调试扩展。

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

      返回:
      作为字符串的源代码调试扩展属性
      抛出:
      AbsentInformationException - 如果未指定扩展
      UnsupportedOperationException - 如果目标虚拟机不支持此操作 - 请参阅canGetSourceDebugExtension()
    • isStatic

      boolean isStatic()
      确定此类型是否被声明为静态。只有嵌套类型可以声明为静态,因此对于任何包级别类型、数组类型或原始类,都会返回 false
      返回:
      如果此类型是静态,则返回 true;否则返回 false。
    • isAbstract

      boolean isAbstract()
      确定此类型是否被声明为抽象。

      对于数组(ArrayType)和原始类,返回值是未定义的。

      返回:
      如果此类型是抽象的,则返回 true;否则返回 false。
    • isFinal

      boolean isFinal()
      确定此类型是否被声明为最终的。

      对于数组(ArrayType)和原始类,返回值始终为 true。

      返回:
      如果此类型是最终的,则返回 true;否则返回 false。
    • isPrepared

      boolean isPrepared()
      确定此类型是否已准备就绪。请参阅 JVM 规范以了解类准备的定义。

      对于数组(ArrayType)和原始类,返回值是未定义的。

      返回:
      如果此类型已准备就绪,则返回 true;否则返回 false。
    • isVerified

      boolean isVerified()
      确定此类型是否已验证。请参阅 JVM 规范以了解类验证的定义。

      对于数组(ArrayType)和原始类,返回值是未定义的。

      返回:
      如果此类型已验证,则返回 true;否则返回 false。
    • isInitialized

      boolean isInitialized()
      确定此类型是否已初始化。请参阅 JVM 规范以了解类验证的定义。对于InterfaceType,此方法始终返回与isPrepared()相同的值。

      对于数组(ArrayType)和原始类,返回值是未定义的。

      返回:
      如果此类型已初始化,则返回 true;否则返回 false。
    • failedToInitialize

      boolean failedToInitialize()
      确定此类的初始化是否失败。请参阅 JVM 规范以了解类初始化的详细信息。

      对于数组(ArrayType)和原始类,返回值是未定义的。

      返回:
      如果尝试初始化并失败,则返回 true;否则返回 false。
    • fields

      List<Field> fields()
      返回一个包含此类型中声明的每个Field的列表。不包括继承的字段。编译器创建的任何合成字段都包含在列表中。

      对于数组(ArrayType)和原始类,返回的列表始终为空。

      返回:
      一个包含Field对象的列表;如果不存在字段,则列表长度为 0。
      抛出:
      ClassNotPreparedException - 如果此类尚未准备就绪。
    • visibleFields

      List<Field> visibleFields()
      返回一个包含此类型中每个未隐藏且明确的Field的列表。包括可以通过其简单名称从类或其实例访问的每个字段。由于在更近期继承的类中通过其简单名称无法访问的字段或被隐藏的字段,因此无法通过其简单名称访问这些字段,并且不包括在返回的列表中。所有其他继承的字段都包括在内。有关详细信息,请参阅 JLS 第 8.3 节。

      对于数组(ArrayType)和原始类,返回的列表始终为空。

      返回:
      一个包含Field对象的列表;如果不存在可见字段,则列表长度为 0。
      抛出:
      ClassNotPreparedException - 如果此类尚未准备就绪。
    • allFields

      List<Field> allFields()
      返回一个包含此类型中声明的每个Field,以及其超类、实现的接口和/或超接口中的字段的列表。包括所有声明的和继承的字段,无论它们是否被隐藏或多重继承。

      对于数组(ArrayType)和原始类,返回的列表始终为空。

      返回:
      一个包含Field对象的列表;如果不存在字段,则列表长度为 0。
      抛出:
      ClassNotPreparedException - 如果此类尚未准备就绪。
    • fieldByName

      Field fieldByName(String fieldName)
      查找具有给定非模糊名称的可见Field。此方法遵循JLS(8.3.3)中指定的继承规则来确定可见性。

      对于数组(ArrayType)和原始类,返回值始终为null。

      参数:
      fieldName - 包含所需字段名称的字符串。
      返回:
      一个Field对象,反映找到的字段,如果没有具有给定名称的字段或给定名称不明确,则返回null。
      抛出:
      ClassNotPreparedException - 如果此类尚未准备好。
    • methods

      List<Method> methods()
      返回一个包含此类型中直接声明的每个Method的列表。不包括继承的方法。构造函数,如果有的话,以及编译器创建的任何合成方法都包含在列表中。

      对于数组(ArrayType)和原始类,返回的列表始终为空。

      返回:
      一个包含Method对象的列表;如果没有方法存在,则列表长度为0。
      抛出:
      ClassNotPreparedException - 如果此类尚未准备好。
    • visibleMethods

      List<Method> visibleMethods()
      返回一个包含此类型声明或继承的每个Method的列表。不包括已被隐藏或覆盖的超类或超接口的方法。

      请注意,尽管排除了这些方法,但返回的列表中可能存在具有相同签名的多个继承方法,但最多只能有一个是ClassType的成员。有关详细信息,请参阅JLS第8.4.8节。

      对于数组(ArrayType)和原始类,返回的列表始终为空。

      返回:
      一个包含Method对象的列表;如果没有可见方法存在,则列表长度为0。
      抛出:
      ClassNotPreparedException - 如果此类尚未准备好。
    • allMethods

      List<Method> allMethods()
      返回一个包含此类型中声明的每个Method及其超类、实现接口和/或超接口的列表。包括所有声明的和继承的方法,无论它们是否被隐藏或覆盖。

      对于数组(ArrayType)和原始类,返回的列表始终为空。

      返回:
      一个包含Method对象的列表;如果没有方法存在,则列表长度为0。
      抛出:
      ClassNotPreparedException - 如果此类尚未准备好。
    • methodsByName

      List<Method> methodsByName(String name)
      返回一个包含具有给定名称的每个可见Method的列表。这通常用于查找重载方法。

      不包括覆盖和隐藏的方法。有关详细信息,请参阅JLS(8.4.8)。

      对于数组(ArrayType)和原始类,返回的列表始终为空。

      参数:
      name - 要查找的方法的名称。
      返回:
      一个包含与给定名称匹配的Method对象的列表;如果没有找到匹配的方法,则列表长度为0。
      抛出:
      ClassNotPreparedException - 如果此类尚未准备好。
    • methodsByName

      List<Method> methodsByName(String name, String signature)
      返回一个包含具有给定名称和签名的每个可见Method的列表。签名字符串是目标方法的JNI签名:
      • ()V
      • ([Ljava/lang/String;)V
      • (IIII)Z
      此方法遵循JLS(8.4.8)中指定的继承规则来确定可见性。

      列表中最多有一个方法是具体方法并且是ClassType的组成部分;列表中的其他方法都是抽象的。使用ClassType.concreteMethodByName(java.lang.String, java.lang.String)仅检索匹配的具体方法。

      对于数组(ArrayType)和原始类,返回的列表始终为空。

      参数:
      name - 要查找的方法的名称。
      signature - 要查找的方法的签名
      返回:
      一个包含与给定名称和签名匹配的Method对象的列表;如果没有找到匹配的方法,则列表长度为0。
      抛出:
      ClassNotPreparedException - 如果此类尚未准备好。
    • nestedTypes

      List<ReferenceType> nestedTypes()
      返回一个包含在此类型中声明并当前加载到虚拟机中的每个ReferenceType对象的列表。静态嵌套类型和非静态嵌套类型(即内部类型)都包括在内。本地内部类型(在此引用类型的某个代码块中声明)也包括在返回的列表中。

      对于数组(ArrayType)和原始类,返回的列表始终为空。

      返回:
      一个嵌套的ReferenceType对象的列表;如果没有嵌套类型,则列表长度为0。
    • getValue

      Value getValue(Field field)
      获取此类型中给定静态FieldValue。该字段必须对此类型有效;即,它必须在此类型、超类、超接口或实现的接口中声明。
      参数:
      field - 包含请求值的字段
      返回:
      实例字段的Value
      抛出:
      IllegalArgumentException - 如果该字段对于此对象的类无效。
    • getValues

      Map<Field,Value> getValues(List<? extends Field> fields)
      返回一个包含给定列表中每个静态FieldValue的映射。这些字段必须对此类型有效;即,它们必须在此类型、超类、超接口或实现的接口中声明。
      参数:
      fields - 包含请求值的Field对象的列表。
      返回:
      包含请求的Field对象及其Value的映射。
      抛出:
      IllegalArgumentException - 如果任何字段对于此对象的类无效。
      VMMismatchException - 如果一个Mirror参数和此镜像不属于同一个VirtualMachine
    • classObject

      ClassObjectReference classObject()
      返回与目标VM中此类型对应的类对象。VM为每种ReferenceType创建类对象:类、接口和数组类型。
      返回:
      目标VM中此引用类型的ClassObjectReference
    • allLineLocations

      List<Location> allLineLocations() throws AbsentInformationException
      返回一个包含此引用类型中每个可执行源行的Location对象的列表。

      此方法等效于allLineLocations(vm.getDefaultStratum(),null) - 有关更多信息,请参见allLineLocations(String,String)

      抛出:
      AbsentInformationException - 如果此类没有行号信息,并且此类具有非本地、非抽象的可执行成员。
      ClassNotPreparedException - 如果此类尚未准备好。
    • allLineLocations

      List<Location> allLineLocations(String stratum, String sourceName) throws AbsentInformationException
      返回一个包含每个可执行源行的Location对象的列表。每个位置将一个源行映射到一个代码索引范围。可以通过Location.codeIndex()确定范围的起始位置。如果编译器和/或VM将该行映射到两个或更多不相交的代码索引范围,则返回的列表可能包含特定行号的多个位置。请注意,同一源行可能在不同方法中表示不同的代码索引范围。

      对于数组(ArrayType)和原始类,返回的列表始终为空。对于接口(InterfaceType),仅当接口的类初始化中存在可执行代码时,返回的列表才会非空。

      返回的列表是针对指定的stratum(请参阅Location以获取strata的描述)。

      参数:
      stratum - 要检索信息的stratum,或者为defaultStratum()null
      sourceName - 仅返回此源文件中的位置,或者为null以返回所有位置。
      返回:
      所有源行Location对象的列表。
      抛出:
      AbsentInformationException - 如果此类没有行号信息,并且此类具有非本地的、非抽象的可执行成员。或者如果sourceName为非null且不存在源名称信息。
      ClassNotPreparedException - 如果此类尚未准备好。
      自:
      1.4
    • locationsOfLine

      List<Location> locationsOfLine(int lineNumber) throws AbsentInformationException
      返回一个包含映射到给定行号的所有Location对象的列表。

      此方法等效于locationsOfLine(vm.getDefaultStratum(), null, lineNumber) - 有关更多信息,请参见locationsOfLine(java.lang.String,java.lang.String,int)

      参数:
      lineNumber - 行号
      返回:
      所有映射到给定行号的Location对象的列表。
      抛出:
      AbsentInformationException - 如果此类没有行号信息。
      ClassNotPreparedException - 如果此类尚未准备好。
      参见:
    • locationsOfLine

      List<Location> locationsOfLine(String stratum, String sourceName, int lineNumber) throws AbsentInformationException
      返回一个包含映射到给定行号的所有Location对象的列表。

      对于数组(ArrayType)和原始类,返回的列表始终为空。对于接口(InterfaceType),仅当接口的类初始化中在指定行号处存在可执行代码时,返回的列表才会非空。如果指定行号处没有可执行代码,则返回空列表。

      返回的列表是针对指定的stratum(请参阅Location以获取strata的描述)。

      参数:
      stratum - 用于比较行号和源名称的stratum,或者为defaultStratum()null
      sourceName - 包含行号的源名称,或者为null以匹配所有源名称
      lineNumber - 行号
      返回:
      所有映射到给定行号的Location对象的列表。
      抛出:
      AbsentInformationException - 如果此类没有行号信息。或者如果sourceName为非null且不存在源名称信息。
      ClassNotPreparedException - 如果此类尚未准备好。
      自:
      1.4
    • availableStrata

      List<String> availableStrata()
      返回此引用类型的可用strata。

      请参阅Location以获取strata的描述。

      返回:
      java.lang.String的列表,每个表示一个stratum
      自:
      1.4
    • defaultStratum

      String defaultStratum()
      返回此引用类型的默认stratum。此值在类文件中指定,用户无法设置。如果类文件未指定默认stratum,则将返回基本stratum("Java")。

      请参阅Location以获取strata的描述。

      自:
      1.4
    • instances

      List<ObjectReference> instances(long maxInstances)
      返回此ReferenceType的实例。仅返回可达以进行垃圾回收的实例。

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

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

      boolean equals(Object obj)
      将指定的对象与此ReferenceType进行比较,以确定它们是否相等。
      覆盖:
      equals 在类 Object
      参数:
      obj - 要比较的参考对象。
      返回:
      如果对象是ReferenceType,如果ReferenceTypes属于同一VM,并且它们反映与VM中的java.lang.Class的相同实例对应的类,则返回true。
      参见:
    • hashCode

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

      int majorVersion()
      返回类主要版本号,如Java虚拟机规范的类文件格式中定义。对于数组(ArrayType)和原始类,返回的主要版本号值为零。并非所有目标虚拟机都支持此操作。使用VirtualMachine.canGetClassFileVersion()来确定是否支持该操作。
      返回:
      类的主要版本号。
      抛出:
      UnsupportedOperationException - 如果目标虚拟机不支持此操作 - 请参见canGetClassFileVersion()
      自:
      1.6
    • minorVersion

      int minorVersion()
      返回类次要版本号,如Java虚拟机规范的类文件格式中定义。对于数组(ArrayType)和原始类,返回的次要版本号值为零。并非所有目标虚拟机都支持此操作。使用VirtualMachine.canGetClassFileVersion()来确定是否支持该操作。
      返回:
      类的次要版本号。
      抛出:
      UnsupportedOperationException - 如果目标虚拟机不支持此操作 - 请参见 canGetClassFileVersion()
      自版本:
      1.6
    • constantPoolCount

      int constantPoolCount()
      返回常量池中的条目数加一。这对应于Java虚拟机规范中的Class文件格式的constant_pool_count项。对于数组(ArrayType)和原始类,返回的常量池计数值为零。并非所有目标虚拟机都支持此操作。使用VirtualMachine.canGetConstantPool()来确定是否支持该操作。
      返回:
      类的常量池条目总数加一。
      抛出:
      UnsupportedOperationException - 如果目标虚拟机不支持此操作 - 请参见 canGetConstantPool()
      自版本:
      1.6
      另请参阅:
    • constantPool

      byte[] constantPool()
      返回常量池的原始字节,格式符合Java虚拟机规范中的constant_pool项的格式。常量池的格式可能在Class文件格式的不同版本之间有所不同,因此应检查次要和主要类版本号以确保兼容性。对于数组(ArrayType)和原始类,将返回一个长度为零的字节数组。并非所有目标虚拟机都支持此操作。使用VirtualMachine.canGetConstantPool()来确定是否支持该操作。
      返回:
      常量池的原始字节。
      抛出:
      UnsupportedOperationException - 如果目标虚拟机不支持此操作 - 请参见 canGetConstantPool()
      自版本:
      1.6
      另请参阅: