Module java.base
Package java.lang

Class Package

java.lang.Object
java.lang.Package
所有已实现的接口:
AnnotatedElement

public class Package extends Object implements AnnotatedElement
代表与类加载器关联的运行时包的元数据。元数据包括注解、版本和封装。

运行时包的注解是从与运行时包中的类相同代码源的package-info.class中读取的。

组成运行时包的类可能实现特定规范。当定义Package时,可以提供规范标题、版本和供应商(指示规范所有者/维护者)信息。应用程序可以通过使用Package.isCompatibleWith(String)方法询问Package是否与特定规范版本兼容。此外,当定义Package时,还可以提供有关实际组成运行时包的类的信息。此信息包括实现标题、版本和供应商(指示类供应商)。

可以使用ClassLoader.definePackage(String, String, String, String, String, String, String, URL)方法显式定义Package。调用者提供规范和实现标题、版本和供应商。调用者还指示包是否已封装。如果在定义运行时包中的类时未显式定义Package,则Package将由类的定义类加载器自动定义,如下所示。

为命名模块中的类自动定义的Package具有以下属性:

  • 包的名称是从类的二进制名称派生的。由于命名模块中的类必须位于命名包中,因此派生名称永远不为空。
  • 如果已知,包将使用模块位置作为代码源进行封装。
  • 规范和实现标题、版本和供应商未指定。
  • 包上的任何注解都将从package-info.class中读取,如上所述。

为无名模块中的类自动定义的Package具有以下属性:

  • 包的名称可以是""(对于无名包中的类)或从类的二进制名称派生的(对于命名包中的类)。
  • 包未封装。
  • 规范和实现标题、版本和供应商未指定。
  • 包上的任何注解都将从package-info.class中读取,如上所述。

可以使用Package.getPackage(String)ClassLoader.getDefinedPackage(String)方法获取Package。每个由类加载器定义的Package都可以使用Package.getPackages()ClassLoader.getDefinedPackages()方法获取。

实现注意:
内置类加载器不会为命名模块中的包显式定义Package对象。相反,这些包将自动定义,并且没有规范和实现版本信息。
参见 Java虚拟机规范:
5.3 创建和加载
自 JDK 版本:
1.2
另请参阅:
  • Method Details

    • getName

      public String getName()
      返回此包的名称。
      返回:
      Java语言规范6.5.3节中定义的此包的完全限定名称,例如,java.lang
    • getSpecificationTitle

      public String getSpecificationTitle()
      返回此包实现的规范的标题。
      返回:
      规范标题,如果未知则返回null
    • getSpecificationVersion

      public String getSpecificationVersion()
      返回此包实现的规范的版本号。此版本字符串必须是由非负十进制整数序列用"."分隔的字符串,并且可能具有前导零。比较版本字符串时,将比较最重要的数字。

      规范版本号使用由句点"."分隔的非负十进制整数序列的语法,例如"2.0"或"1.2.3.4.5.6.7"。这允许使用可扩展数字来表示主要、次要、微型等版本。版本规范由以下形式语法描述:

      规范版本:
      数字 精化版本可选
      精化版本:
      . 数字
      . 数字 精化版本
      数字:
      数字
      数字
      数字:
      任何使Character.isDigit(char)返回true的字符,例如0、1、2等。
      返回:
      规范版本,如果未知则返回null
    • getSpecificationVendor

      public String getSpecificationVendor()
      返回拥有并维护实现此包的类规范的组织、供应商或公司的名称。
      返回:
      规范供应商,如果未知则返回null
    • getImplementationTitle

      public String getImplementationTitle()
      返回此包的标题。
      返回:
      实现标题,如果未知则返回null
    • getImplementationVersion

      public String getImplementationVersion()
      返回此实现的版本。它由此实现的供应商分配的任何字符串组成,没有Java运行时指定或期望的特定语法。可以将此版本字符串与此供应商为此包使用的其他包版本字符串进行比较以进行相等性比较。
      返回:
      实现版本,如果未知则返回null
    • getImplementationVendor

      public String getImplementationVendor()
      返回实现此包的供应商,如果未知则返回null
      返回:
      实现此包的供应商,如果未知则返回null
    • isSealed

      public boolean isSealed()
      返回true如果此包已封装。
      API 注意:
      包封装封装类或接口无关。包封装特定于为无名模块中的类定义的JAR文件。有关如何将Package定义为封装包的详细信息,请参阅Package类规范。
      返回:
      如果包已封装,则返回true,否则返回false
    • isSealed

      public boolean isSealed(URL url)
      返回true如果此包相对于指定的代码源url已封装。
      API注释:
      包封装封装类或接口 没有关系。包封装是针对未命名模块中定义的JAR文件中的类的。请参阅 Package 类规范,了解如何将 Package 定义为封装包的详细信息。
      参数:
      url - 代码源URL
      返回:
      如果此包相对于给定的 url 是封装的,则返回true
    • isCompatibleWith

      public boolean isCompatibleWith(String desired) throws NumberFormatException
      比较此包的规范版本与所需版本。如果此包的规范版本号大于或等于所需版本号,则返回true。

      版本号通过按顺序比较所需和规范字符串的对应组件来比较。每个组件都转换为十进制整数并进行比较。如果规范值大于所需值,则返回true。如果值较小,则返回false。如果值相等,则跳过句点并比较下一对组件。

      参数:
      desired - 所需版本的版本字符串。
      返回:
      如果此包的版本号大于或等于所需版本号,则返回true
      抛出:
      NumberFormatException - 如果当前版本未知或所需版本或当前版本不是正确的点分形式。
    • getPackage

      @Deprecated(since="9") public static Package getPackage(String name)
      Deprecated.
      If multiple class loaders delegate to each other and define classes with the same package name, and one such loader relies on the lookup behavior of getPackage to return a Package from a parent loader, then the properties exposed by the Package may not be as expected in the rest of the program. For example, the Package will only expose annotations from the package-info.class file defined by the parent loader, even if annotations exist in a package-info.class file defined by a child loader. A more robust approach is to use the ClassLoader.getDefinedPackage(java.lang.String) method which returns a Package for the specified class loader.
      在调用者的类加载器及其祖先中按名称查找包。

      如果调用者的类加载器定义了给定名称的 Package,则返回 Package。否则,递归搜索调用者的类加载器的祖先(逐级父级)以查找给定名称的 Package

      调用此方法等效于在调用者的类加载器上调用 ClassLoader.getPackage(java.lang.String)

      参数:
      name - 包名称,例如 "java.lang"
      返回:
      被调用者的类加载器或其祖先定义的给定名称的 Package,如果未找到则返回 null
      抛出:
      NullPointerException - 如果 namenull
      另请参阅:
    • getPackages

      public static Package[] getPackages()
      返回由调用者的类加载器及其祖先定义的所有 Package。返回的数组可能包含同一包名称的多个 Package 对象,每个由类加载器层次结构中的不同类加载器定义。

      调用此方法等效于在调用者的类加载器上调用 ClassLoader.getPackages()

      返回:
      由此类加载器及其祖先定义的 Package 对象数组
      另请参阅:
    • hashCode

      public int hashCode()
      返回从包名称计算的哈希码。
      覆盖:
      hashCode 在类 Object
      返回:
      从包名称计算的哈希码。
      另请参阅:
    • toString

      public String toString()
      返回此包的字符串表示形式。其值为字符串 "package " 和包名称。如果定义了包标题,则会附加。如果定义了包版本,则会附加。
      覆盖:
      toString 在类 Object
      返回:
      包的字符串表示形式。
    • getAnnotation

      public <A extends Annotation> A getAnnotation(Class<A> annotationClass)
      如果指定类型的注释存在,则返回此元素的注释,否则返回null。

      请注意,此方法返回的任何注释都是声明注释。

      指定者:
      getAnnotation 在接口 AnnotatedElement
      类型参数:
      A - 要查询并返回的注释类型
      参数:
      annotationClass - 对应于注释类型的Class对象
      返回:
      如果此元素上存在指定注释类型的注释,则返回此元素的注释,否则返回null
      抛出:
      NullPointerException - 如果给定的注释类为null
      自:
      1.5
    • isAnnotationPresent

      public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)
      如果指定类型的注释存在于此元素上,则返回true,否则返回false。此方法主要设计用于方便访问标记注释。

      此方法返回的真值等同于: getAnnotation(annotationClass) != null

      指定者:
      isAnnotationPresent 在接口 AnnotatedElement
      参数:
      annotationClass - 对应于注释类型的Class对象
      返回:
      如果此元素上存在指定注释类型的注释,则返回true,否则返回false
      抛出:
      NullPointerException - 如果给定的注释类为null
      自:
      1.5
    • getAnnotationsByType

      public <A extends Annotation> A[] getAnnotationsByType(Class<A> annotationClass)
      返回与此元素关联的注释。如果没有与此元素关联的注释,则返回值为长度为0的数组。此方法与 AnnotatedElement.getAnnotation(Class) 的区别在于,此方法检测其参数是否为可重复注释类型(JLS 9.6),如果是,则尝试通过“查看”容器注释来查找一个或多个该类型的注释。调用此方法的调用者可以修改返回的数组;这不会影响返回给其他调用者的数组。

      请注意,此方法返回的任何注释都是声明注释。

      指定者:
      getAnnotationsByType 在接口 AnnotatedElement
      类型参数:
      A - 要查询并返回的注释类型
      参数:
      annotationClass - 对应于注释类型的Class对象
      返回:
      如果与此元素关联的注释为指定的注释类型,则返回所有此元素的注释,否则返回长度为零的数组
      抛出:
      NullPointerException - 如果给定的注释类为null
      自:
      1.8
    • getAnnotations

      public Annotation[] getAnnotations()
      返回此元素上存在的注释。如果此元素上没有注释,则返回值为长度为0的数组。调用此方法的调用者可以修改返回的数组;这不会影响返回给其他调用者的数组。

      请注意,此方法返回的任何注释都是声明注释。

      指定者:
      getAnnotations 在接口 AnnotatedElement
      返回:
      此元素上存在的注释
      自:
      1.5
    • getDeclaredAnnotation

      public <A extends Annotation> A getDeclaredAnnotation(Class<A> annotationClass)
      如果直接存在指定类型的注释,则返回此元素的注释,否则返回null。此方法会忽略继承的注释。(如果此元素上没有直接存在的注释,则返回null。)

      请注意,此方法返回的任何注释都是声明注释。

      指定者:
      getDeclaredAnnotation 在接口 AnnotatedElement
      类型参数:
      A - 要查询并返回的直接存在的注释类型
      参数:
      annotationClass - 对应于注释类型的Class对象
      返回:
      如果此元素上直接存在指定注释类型的注释,则返回此元素的注释,否则返回null
      抛出:
      NullPointerException - 如果给定的注释类为null
      自:
      1.8
    • getDeclaredAnnotationsByType

      public <A extends Annotation> A[] getDeclaredAnnotationsByType(Class<A> annotationClass)
      从接口复制的描述: AnnotatedElement
      返回指定类型的此元素的注解(如果这些注解是直接存在间接存在)。此方法忽略继承的注解。如果在此元素上没有直接或间接存在的指定注解,则返回值是长度为0的数组。此方法与AnnotatedElement.getDeclaredAnnotation(Class)方法的区别在于,此方法检测其参数是否为可重复注解类型(JLS 9.6),如果是,则尝试通过“查找”容器注解来找到一个或多个该类型的注解。调用此方法的调用者可以修改返回的数组;这不会对返回给其他调用者的数组产生影响。
      指定者:
      getDeclaredAnnotationsByType 在接口 AnnotatedElement
      类型参数:
      A - 要查询并返回的注解类型
      参数:
      annotationClass - 对应于注解类型的Class对象
      返回:
      如果直接或间接存在于此元素上的指定注解类型的所有注解,否则为长度为零的数组
      抛出:
      NullPointerException - 如果给定的注解类为null
      自版本:
      1.8
    • getDeclaredAnnotations

      public Annotation[] getDeclaredAnnotations()
      返回此元素上直接存在的注解。此方法忽略继承的注解。如果此元素上没有直接存在的注解,则返回值为长度为0的数组。调用此方法的调用者可以修改返回的数组;这不会对返回给其他调用者的数组产生影响。

      请注意,此方法返回的任何注解都是声明注解。

      指定者:
      getDeclaredAnnotations 在接口 AnnotatedElement
      返回:
      此元素上直接存在的注解
      自版本:
      1.5