Documentation Comment Specification for the Standard Doclet (JDK 21)

本文档指定了标准doclet识别的文档注释形式,用于JDK 21中的javadoc工具,用于为API生成HTML文档。

javadoc工具的上下文中,文档注释的内容解释取决于用于处理注释的doclet。其他doclet可能接受与标准doclet相同的语法,或者它们可能支持替代语法。然而,由于许多工具的支持,标准doclet支持的语法已成为事实上的标准。

通用语法

只有当文档注释直接放置在模块、包、类、接口、构造函数、方法、枚举成员或字段声明之前时,才会识别文档注释。在方法体中放置的文档注释将被忽略。每个声明语句只能识别一个文档注释。

文档注释的整体形式是一个初始的主描述,后跟一系列块标签,这些块标签提供有关注释适用的声明的附加信息。描述性文本可能包括内联标签HTML内容,如下所述。在每行开头的前导星号和任何前导空格将被忽略。

可能存在只有块标签而没有主描述的注释。

出于历史原因,包的文档注释可以在源目录中的名为package.html的文件中提供。在这种情况下,文档注释是<body>标记的内容,并且所有对Java类型的引用(例如,在@see标记中)必须是完全限定的。标准doclet还允许在诸如overview.html之类的文件中提供附加文档。这类内容的规则与package.html的规则相同。

主描述

文档注释中的主描述是从注释开头到第一个块标签(如果有的话)或到注释结尾(如果没有块标签)的内容。前导和尾随空格将被忽略。如果没有这样的内容,则称主描述缺失。

主描述不能在任何块标签之后继续。

主描述的第一句应该是一个摘要句,包含对声明实体的简明但完整的描述。

块标签

块标签的形式为@标识符 内容,提供要合并到生成的文档中的附加详细信息。每个块标签必须出现在一行的开头,忽略前导星号、空白字符和初始注释分隔符(/**)。这意味着您可以在文本中的其他位置使用@字符,它不会被解释为标签的开始。如果要以@字符开头的行,并且不希望它被解释,则使用HTML实体&#064;。块标签的内容是跟随标签的任何文本,直到下一个块标签或文档注释的结尾,但不包括这些内容。内容可以跨越多行。

可以有任意数量的块标签;某些类型的标签可以重复,而其他类型的标签则不行。

内联标签

内联标签的形式为{@标识符 内容},在封闭描述的上下文中提供详细信息。它们通常可以出现在允许描述性文本和HTML的任何地方,尽管某些内联标签可能只能用于主描述的开头。

某些内联标签可能包含自由格式文本。当这样的文本明确包含大括号时,大括号必须“平衡”,即适当嵌套的左大括号和右大括号字符数量相等,以便可以确定内联标签的结束大括号。不执行文本的其他词法分析;特别是,不会特别考虑字符如'"\@

在内联标签中包含的以@开头的行不被视为开始块标签。

当文本内容为HTML时,可以使用实体&lbrace;&rbrace;来表示不平衡的大括号。

HTML内容

HTML内容没有经过正式检查,尽管一些工具可能提供一定程度的检查以帮助捕获常见错误。

为了能够生成符合适当标准的文档,使用HTML结构时应考虑以下事项:

前导星号

当读取文档注释时,每行上的前导星号(*)将被丢弃,并且丢弃前导星号(*)之前的空格和制表符。如果在一行上省略了前导星号,则前导空格将不再被移除,以便您可以直接将代码示例粘贴到文档注释中,其中代码示例位于<pre>标记内并保留了缩进。空格在浏览器中的解释更加统一。缩进是相对于左边距(而不是分隔符/**<pre>标记)。

转义序列

在文本、实体和HTML可能出现的任何地方,支持以下转义序列,以表示否则难以表示或难以表示的字符:

转义序列是上下文敏感的,只能在转义字符本身的使用会有不同的语法解释的情况下使用。在其他情况下,这些字符序列被直接采用,没有额外的解释。

不能在包含文字的内联标签中使用转义序列;这包括{@code}{@literal}{@snippet}和用户定义的标签。

引用

引用是文档注释中引用周围声明中元素的结构。根据上下文,它们可能引用模块、包、类和接口、构造函数、方法、注解成员、字段、枚举成员、参数、记录组件的名称以及方法或构造函数可能抛出的异常的名称。

引用的最一般形式是:

此形式由@see{@link}{@linkplain}标签使用。

当可以从周围上下文推断时,可以省略前导组件。当不需要时,可以省略尾部组件。通常,引用在文档注释存在的范围内进行评估。特别是,在评估类和接口名称时,将考虑编译单元的import语句。

可以是任何顶级或嵌套类或接口。

成员可以是任何构造函数、方法、注解成员、字段或枚举成员,但不能是嵌套类或接口。与Java源代码一样,构造函数通过使用其类的名称来标识。构造函数或方法的名称通常应跟随其参数类型列表,括在括号中,尽管如果方法或构造函数没有重载且名称不是同一类或接口中的字段或枚举成员的名称,则可以省略参数类型和括号。当给出参数列表时,参数列表中的标记之间可以出现空格;在引用中,其他地方不能出现空格。当引用是对与包含文档注释的类相同的类的成员时,可以省略引用的所有部分,直到包括#在内,尽管为了清晰起见,可以保留#

可以在引用的类和成员部分中使用参数化类型;注解不能在引用的任何地方使用。在构造函数或方法的参数列表中,标记之间可以出现空格。可以在名称后添加一个尾部/以引用模块,以避免与具有相同名称的包或类发生冲突。

注意:不能使用此形式引用特定参数或记录组件的声明。

##)作为分隔符:

片段被解释为指定程序元素文档页面内的URI片段。

@param@throws@serialField,可能仅支持与每个标签相关的特定引用类型。有关更多详细信息,请参阅各个标签的描述。

注释继承

类和接口继承

  • 当类中的方法覆盖超类中的方法时
  • 当接口中的方法覆盖超接口中的方法时
  • 当类中的方法实现接口中的方法时

在前两种情况下,标准文档生成器在覆盖方法的文档中生成子标题“覆盖”。包括对被覆盖方法的链接,无论注释是否被继承。

在第三种情况下,当指定类中的方法实现接口中的方法时,标准文档生成器在覆盖方法的文档中生成子标题“指定”。包括对被实现方法的链接,无论注释是否被继承。

方法注释继承

标准文档生成器允许在类和接口中进行方法注释继承,以填充缺失的文本或显式继承方法注释。构造函数、字段和嵌套类不继承文档注释。

注意:继承方法的源文件必须在由 -sourcepath 选项指定的路径上,以便文档注释可用于复制。类或其包都不需要在命令行上传递。

填充缺失文本

当方法注释中缺少主要描述、@return@param@throws标签时,信息将从其覆盖或实现的方法中复制。

当特定参数的@param标签缺失时,将从继承层次结构中更高的方法中复制该参数的注释。当特定异常的@throws标签缺失时,仅当声明了该异常时才会复制@throws标签。

显式继承

在方法主要描述或@return@param@throws标签注释中插入{@inheritDoc}内联标记。将相应的继承主要描述或标记注释复制到该位置。

方法注释算法

如果方法没有文档注释,或具有{@inheritDoc}标记,则标准文档生成器使用以下算法搜索适用的注释。该算法旨在找到最具体的适用文档注释,并优先考虑接口而不是超类:

  1. 按照类型声明中跟随单词implements(或extends)的顺序查找每个直接实现(或扩展)的接口。使用找到的此方法的第一个文档注释。
  2. 如果步骤1未找到文档注释,则递归应用整个算法到每个直接实现(或扩展)的接口,顺序与步骤1中检查的顺序相同。
  3. 当步骤2未找到文档注释,并且这是一个除了Object类之外的类,但不是接口时:
    1. 如果超类有此方法的文档注释,则使用它。
    2. 如果步骤3a未找到文档注释,则递归应用整个算法到超类。

标准标签

以下部分描述了标准文档生成器支持的标准块和内联标签。

注意:标准文档生成器还支持符合相同一般语法规则的用户定义标签。

@author

  • @author name-text

在使用-author选项时,将指定的名称文本添加到生成的文档中的“作者”条目中。文档注释可以包含多个@author标签。您可以为每个@author标签指定一个名称或一个标签指定多个名称。在前一种情况下,标准文档生成器在名称之间插入逗号(,)和空格。在后一种情况下,整个文本将被复制到生成的文档中,而不会被解析。因此,如果希望使用其他逗号以外的本地化名称分隔符,则可以在一行上使用多个名称。

在JDK 1.0中引入。

{@code}

  • {@code text }

等同于<code>{@literal text }</code>

以代码字体显示text,而不解释文本为HTML标记或嵌套的Javadoc标记。这使您可以在文档注释中使用常规尖括号(<>),而不是HTML实体(&lt;&gt;),例如在参数类型(<Object>)、不等式(3 < 4)或箭头(->)中。例如,生成的HTML页面中显示的文档注释文本{@code A<B>C}不变为A<B>C。这意味着<B>不会被解释为粗体,并且以代码字体显示。如果希望在没有代码字体的情况下获得相同功能,则使用{@literal}标签。

在JDK 1.5中引入。

@deprecated

  • @deprecated deprecated-text

此标签与@Deprecated注解一起使用,表示不应再使用此API(即使它可能继续工作)。标准文档生成器将弃用文本移到主要描述的前面,将其放在斜体字体中,并在粗体警告之前。

弃用文本的第一句应告诉用户API何时被弃用以及用作替代的内容。标准文档生成器将第一句复制到摘要部分和索引中。后续句子还可以解释为什么弃用。您应包含一个指向替代API的{@link}标签。

在JDK 1.0中引入。

{@docRoot}

  • {@docRoot}

表示从任何生成的页面到生成文档(目标)根目录的相对路径。当您希望从所有生成的页面引用文件(例如版权页面或公司标志)时,此标签很有用。在每个生成的页面底部链接到版权页面是常见的做法。

{@docRoot}标签可以在命令行和文档注释中使用。此标签在所有文档注释中有效:概述、模块、包、类、接口、构造函数、方法和字段,包括任何标签的文本部分(例如@return@param@deprecated标签)。

例如,在命令行上,定义头部、页脚或底部的地方:

javadoc -bottom '<a href="{@docRoot}/copyright.html">Copyright</a>'。

当您以这种方式在make文件中使用{@docRoot}标签时,一些makefile程序可能需要一种特殊的方式来转义大括号{}字符。例如,在Windows上运行的Inprise MAKE版本5.2需要双大括号:{{@docRoot}}。它还需要双引号(而不是单引号)来包围选项的参数,例如-bottom选项(省略href参数周围的引号)。

例如,在文档注释中:

/**
 * 查看<a href="{@docRoot}/copyright.html">版权</a>。
 */

此标签是必需的,因为生成的文档位于分层目录中,深度取决于子包的数量。表达式<a href="{@docRoot}/copyright.html">解析为<a href="../../copyright.html">(对于java/lang/Object.java)和<a href="../../../copyright.html">(对于java/lang/ref/Reference.java)。

在JDK 1.3中引入。

@exception

  • @exception exception-name description

此标签等效于现在推荐的@throws标签形式。

在JDK 1.0中引入。

@hidden

  • @hidden

从生成的API文档中隐藏程序元素。当无法以其他方式设计API使这些项目根本不出现时,可以使用此标签。

在JDK 9中引入。

{@index}

  • {@index word description }
  • {@index "phrase" description }

声明一个单词或短语,以及一个可选的简短描述,应出现在标准文档生成器生成的索引文件中。索引条目将链接到在生成文档中此处出现的单词或短语。当要索引的单词或短语本身不够清晰时,可以使用描述,例如用于首字母缩写。

在JDK 9中引入。

{@inheritDoc}

  • {@inheritDoc}

从最近可继承的类或可实现的接口中将文档复制到当前文档注释的此标记位置。这使您可以在继承树中更高处编写更一般的注释,并围绕复制的文本编写。

此标签仅在文档注释中的以下位置有效:

  • 在方法的主要描述中。在这种情况下,主要描述从类或接口向上复制。
  • 在方法的@return@param@throws标签的文本参数中。在这种情况下,标签文本从层次结构中相应的标签复制。

请参阅方法注释继承以了解如何在继承层次结构中找到注释的描述。请注意,如果缺少此标记,则根据该部分中描述的规则,注释是否自动继承。

在JDK 1.4中引入。

  • {@link reference label }

插入一个内联链接,带有可见文本标签,指向引用类的指定模块、包、类或成员名称的文档。此标签在所有文档注释中有效:概述、模块、包、类、接口、构造函数、方法和字段,包括任何标签的描述部分,如@return@param@deprecated标签。

此标签类似于@see标签的第三种形式。主要区别在于{@link}标签生成内联链接,而不是将链接放在“另请参阅”部分中。{@link}标签以大括号开始和结束,以将其与其余内联文本分隔开。如果需要在标签内使用右大括号(}),则使用HTML实体表示法&#125;

在一个句子中允许使用任意数量的{@link}标签。

例如,这里是一个引用getComponentAt(int, int)方法的注释:

使用{@link #getComponentAt(int, int) getComponentAt}方法。

从这段代码中,标准文档生成以下HTML(假设它引用同一包中的另一个类):

使用<a href="Component.html#getComponentAt(int,int)">getComponentAt</a>方法。

前一行在网页上显示为:

使用getComponentAt方法。

JDK 1.2中引入。

{@linkplain}

  • {@linkplain reference label }

{@link}标签的行为相同,只是链接标签以纯文本形式显示而不是代码字体。当标签是纯文本时很有用。例如,

参考{@linkplain #add() 被覆盖的方法}。

显示为:

参考被覆盖的方法

JDK 1.4中引入。

{@literal}

  • {@literal text }

显示文本而不解释文本为HTML标记或嵌套的Javadoc标记。这使您可以在文档注释中使用尖括号(<>)而不是HTML实体(&lt;&gt;),例如在参数类型(<Object>)、不等式(3 < 4)或箭头(->)中。例如,文档注释文本{@literal A<B>C}在生成的HTML页面中显示为A<B>C<B>不会被解释为粗体(也不是代码字体)。如果您希望文本在代码字体中具有相同功能,则使用{@code}标签。

JDK 1.5中引入。

@param

  • @param parameter-name description
  • @param <type-parameter-name> description

向“参数”部分添加指定参数名称后跟指定描述的参数。描述可以跨多行。此标签仅在方法、构造函数或类的文档注释中有效。参数名称可以是方法或构造函数中的参数名称,也可以是类、方法或构造函数的类型参数的名称。在这样的参数名称周围使用尖括号(< >)表示使用类型参数。

类的类型参数示例:

/**
 * @param <E> 存储在列表中的元素类型
 */
public interface List<E> extends Collection<E> { ... }

方法的参数示例,包括类型参数:

/**
 * @param string  要转换的字符串
 * @param type    要将字符串转换为的类型
 * @param <T>     元素的类型
 * @param <V>     元素的值
 */
<T, V extends T> V convert(String string, Class<T> type) { ... }

JDK 1.0中引入。

@provides

  • @provides service-type description

此标签仅可出现在模块声明的文档注释中,用于记录模块提供的服务的实现。描述可以用于指定如何获取此服务提供程序的实例,以及提供程序的任何重要特征。

JDK 9中引入。

@return

  • @return description
  • {@return description }

作为块标签,添加一个带有给定描述的“返回”部分,提供有关方法可能返回的值的详细信息。

作为内联标签,为方法主描述的第一句提供内容,并提供一个“返回”部分,就像@return description也存在一样。在默认的英文区域设置中,第一句是返回 description

此标签仅在方法的文档注释中有效。作为内联标签,它只能出现在方法主描述的开头。

JDK 1.0中作为块标签引入,JDK 16中作为内联标签引入。

@see

添加一个带有链接或文本条目的“另请参阅”标题,指向一个引用。文档注释可以包含任意数量的@see标签,它们都被分组在同一个标题下。引用其他程序元素的形式是最常见的。此标签在所有文档注释中有效。要在句子中插入指向包、类或成员的内联链接,请参见{@link}

  • @see "string"

string添加文本条目。不生成链接。该字符串可能是对不可通过URL获得的信息的引用。标准文档生成器通过搜索双引号(")作为第一个字符来区分此情况。

  • @see <a href="url">label</a>

根据url定义添加一个链接。URL可以是相对或绝对URL。标准文档生成器通过搜索小于号(<)作为第一个字符来区分此情况。

  • @see reference label

添加一个链接,可见文本标签指向引用的指定程序元素的文档。

reference可以引用到任何有效的程序元素。如果此元素在文档化的类中,则标准文档生成器会为其创建一个链接。

要创建到外部引用类的链接,请使用-link选项。外部引用类是未在命令行上传递给javadoc工具的类。生成文档中对外部引用类的链接称为外部引用或外部链接。例如,如果仅在java.awt包上运行标准文档生成器,则java.lang中的任何类,如Object,都是外部引用类。使用-link-linkoffline选项链接到外部引用类。外部引用类的源注释对javadoc命令运行不可用。

使用其他两种@see标签形式之一来引用不属于引用类的名称的文档。

label是要用作链接标签的文本,对于程序元素的引用是可选的。如果未为元素引用提供标签,则将基于引用目标生成默认标签。当您希望文本与自动生成的文本不同时,请使用标签。对于URI片段的引用必须提供标签。标签可以包含空格字符。

JDK 1.0中引入。

@serial

  • @serial field-description
  • @serial include
  • @serial exclude

用于默认可序列化字段的文档注释。参见为类的序列化字段和数据编写文档

另请参阅Oracle的包含类在序列化形式规范中的标准

可选的字段描述应解释字段的含义并列出可接受的值。必要时,描述可以跨多行。标准文档生成器将此信息添加到序列化形式页面中。

如果在将类设置为可序列化后向类添加了可序列化字段,则应在其主描述中添加一个语句以标识添加字段的版本。

include和exclude参数标识类或包是否应包含在序列化形式页面中。它们的工作方式如下:

  • 实现Serializable的公共或受保护类将被包含,除非该类(或其包)标记有@serial exclude标签。

  • 实现Serializable的私有或包私有类将被排除,除非该类(或其包)标记有@serial include标签。

例如,javax.swing包在package-info.java中标记为@serial exclude标签。公共类java.security.BasicPermission标记有@serial exclude标签。包私有类java.util.PropertyPermissionCollection标记有@serial include标签。

类级别的@serial标签会覆盖包级别的@serial标签。

JDK 1.2中引入。

@serialData

  • @serialData data-description

使用数据描述值记录序列化形式中数据的类型和顺序。此数据包括writeObject方法写入的可选数据以及Externalizable.writeExternal方法写入的所有数据(包括基类)。

@serialData标签可用于readObjectwriteObjectreadExternalwriteExternalreadResolvewriteReplace方法的文档注释。

JDK 1.2中引入。

@serialField

  • @serialField field-name field-type field-description

记录Serializable类serialPersistentFields成员的ObjectStreamField组件。为每个ObjectStreamField组件使用一个@serialField标签。

JDK 1.2中引入。

@since

  • @since since-text

向生成的文档添加一个带有指定since-text值的“自从”标题。文本没有特殊的内部结构。此标签在任何文档注释中有效:概述、模块、包、类、接口、构造函数、方法或字段。此标签表示此更改或功能自since-text值指定的软件发布以来一直存在,例如:@since 1.5

对于Java平台源代码,@since标签表示Java平台API规范的版本,这不一定是源代码添加到参考实现的时间。允许使用多个@since标签,并且像多个@author标签一样处理。当程序元素被多个API使用时,可以使用多个标签。

在JDK 1.1中引入。

@snippet

  • {@snippet attributes }
  • {@snippet attributes :
       body }

在生成的文档中包含一个示例代码片段,或“snippet”。该代码可以通过在标签内指定body 或在attributes中指定的外部文件中提供。在内容中,可以在行注释中放置标记标签,以标识文本中的区域并指示如何呈现这些区域中的文本。

关于snippet的其他详细信息可以作为attributes给出,形式为name=value对,放在初始标签名称之后。属性名称始终是简单标识符。属性值可以是标识符、无符号整数或用单引号或双引号括起来;不支持转义字符。当属性名称的存在足够时,可以省略属性值和前面的=。属性与标签名称及彼此之间由空格字符(例如空格和换行符)分隔。

snippet可以指定一个id属性,该属性可用于在API和生成的HTML中标识snippet,并可用于创建到snippet的链接。在生成的HTML中,id将放在用于表示snippet的最外层元素上。

代码片段通常是Java源代码,但也可以是属性文件片段、其他语言中的源代码片段或纯文本。snippet可以指定一个lang属性,用于标识snippet中内容的类型。对于内联snippet,默认值为java。对于外部snippet,默认值从包含snippet内容的文件的扩展名派生。

内联snippet

内联snippet包含标签本身内的snippet内容。

在生成的文档中包含的snippet内容是在冒号(:)之后的第一个换行符和闭合大括号(})之间的文本。

不需要使用HTML实体转义字符,也不需要转义文档注释标记。

使用String::stripIndent去除内容中的周围空格。

内联snippet内容的两个限制:

  1. 内容中不能使用字符序列*/,因为*/将终止封闭的文档注释。这包括在/* ... */注释中的使用,或在//注释中的使用,或在字符串文字中的使用,例如用于表示正则表达式的字符串。此限制适用于文档注释中的所有内容;它不是特定于@snippet标签的。

  2. 内联snippet的内容只能包含平衡的大括号字符对。整个内联标签由与开放大括号匹配的第一个右括号终止。此限制适用于所有内联标签;它不是特定于@snippet标签的。

外部snippet

外部snippet指的是包含snippet内容的单独类或文件。

在外部snippet中,可以省略冒号、换行符和后续内容。

与内联snippet不同,外部snippet对其内容没有限制。特别是,它们可以包含/* ... */注释。

外部代码的位置可以通过类名指定,使用class属性,或通过短相对文件路径指定,使用file属性。在任一情况下,文件可以放置在包层次结构中的snippet-files子目录中,该目录包含带有{@snippet ...}标签的源代码的目录。或者,文件可以放置在由javadoc工具的--snippet-path选项指定的辅助搜索路径上。使用snippet-files子目录类似于使用doc-files子目录用于辅助文档文件。

外部snippet的文件可以包含多个区域,以便在文档的不同部分中引用不同的snippet标签。

混合snippet

混合snippet既是内部snippet又是外部snippet。它在标签本身内包含snippet内容,以方便阅读正在文档化的类的源代码的任何人,并且还引用包含snippet内容的单独文件。

如果将混合snippet作为内联snippet处理的结果与将其作为外部snippet处理的结果不匹配,则会出错。

标记标签

标记标签定义snippet内容中的区域。它们还控制内容的呈现,例如突出显示文本的部分、修改文本或链接到文档的其他位置。它们可以用于内部、外部和混合snippet。

标记标签以@name开头,后跟任何必需的参数。它们放置在//注释中(或其他语言或格式中的等效部分),以便不会过度干扰源代码的主体,并且因为内联snippet中不能使用/* ... */注释。这些注释称为标记注释

可以将多个标记标签放置在同一个标记注释中。标记标签应用于包含注释的源行,除非注释以冒号(:)结尾,在这种情况下,就好像标签出现在紧随其后的行上一样。如果标记注释特别长,或者如果snippet内容的语法格式不允许注释出现在非注释源的同一行上,则后一种语法可能很有用。标记注释不会出现在生成的输出中。

因为一些其他系统使用类似于标记注释的元注释,以@开头,后跟一个无法识别的名称的注释将被忽略为标记注释,并将出现在生成的输出中。如果名称被识别,但标记注释中存在后续错误,则会报告错误。在这种情况下,生成的输出是未定义的,关于从snippet生成的输出。

区域

区域是可选命名的行范围,用于标识snippet中要显示的文本。它们还定义了高亮显示或修改文本等操作的范围。

区域的开始由以下之一标记:

  • @start region=name,或
  • 指定regionregion=name@highlight@replace@link标签。如果不需要匹配的@end标签,则可以省略名称。

区域的结束由@end@end region=name标记。如果给出名称,则该标记结束以该名称开始的区域。如果没有给出名称,则该标记结束最近开始的区域,该区域尚未具有匹配的@end标记。

不同匹配的@start@end标记对创建的区域没有约束。区域甚至可以重叠,尽管我们不希望这种用法很常见。

高亮显示

  • @highlight — 高亮显示行或区域内的文本
    • substring — 要高亮显示的文字
    • regex — 要高亮显示的文字的正则表达式
    • region — 定义要在其中查找要高亮显示的文本的范围的区域
    • type — 高亮显示的类型,例如bolditalichighlighted

要在一行或一系列行上突出显示内容,请使用@highlight,后跟指定要考虑的文本范围、在该范围内要高亮显示的文本以及高亮显示类型的参数。

如果指定了regionregion=name,则范围为该区域,直到相应的@end标记。否则,范围仅为当前行。

要在范围内的每个文字实例上进行高亮显示,请使用substring=string指定字符串,其中string可以是标识符或用单引号或双引号括起来的文本。要在范围内的每个与正则表达式匹配的文本实例上进行高亮显示,请使用regex=string。如果未指定这些属性,则将突出显示整个范围。

可以使用type参数指定高亮显示的类型。有效的类型名称为bolditalichighlighted。类型的名称将转换为CSS类名,其属性可以在系统样式表中定义或在用户定义的样式表中覆盖。

修改显示的文本

  • @replace — 替换行或区域内的文本
    • substring — 要替换的文字
    • regex — 要替换的文字的正则表达式
    • region — 定义要在其中查找要替换的文本的范围的区域
    • replacement — 替换文本

通常方便将snippet的内容编写为可以由外部工具访问和验证的代码,但以不编译的形式显示。例如,可能希望包含import语句以说明性目的,以及使用导入类型的代码。或者,可能希望显示带有省略号或其他标记的代码,以指示应在该点插入其他代码。这可以通过用一些替换文本替换snippet内容的部分来实现。

要用替换文本替换一些文本,请使用@replace,后跟指定要考虑的文本范围、在该范围内要替换的文本以及替换文本的参数。

如果指定了regionregion=name,则范围为该区域,直到相应的@end标记。否则,范围仅为当前行。

要在范围内替换每个文本字符串的实例,请使用substring=string指定字符串,其中string可以是标识符或用单引号或双引号括起来的文本。要在范围内替换与正则表达式匹配的每个文本实例,请使用regex=string。如果未指定这些属性,则将替换整个范围。

使用replacement参数指定替换文本。如果使用正则表达式指定要替换的文本,则可以使用$number$name来替换正则表达式中找到的组,如String::replaceAll中定义的那样。

要删除文本,请使用带有空替换字符串的@replace。要插入文本,请使用@replace来替换应插入替换文本的一些无操作文本。无操作文本可以是'//'标记,或空语句(;)。

链接文本

  • @link — 链接行或区域内的文本
    • substring — 要链接的文字
    • regex — 要链接的文本的正则表达式
    • region — 定义要查找要链接的文本的范围的区域
    • target — 链接的目标,以{@link ...}标签适合的形式表示
    • type — 链接类型:默认为linklinkplain之一

要将文本链接到API中的其他声明,请使用@link,后跟指定要考虑的文本范围、该范围内要链接的文本以及链接目标的参数。

如果指定了regionregion=name,则范围为该区域,直到相应的@end标记。否则,范围仅为当前行。

要在范围内链接每个文本字符串的实例,请使用substring=string指定字符串,其中string可以是标识符或用单引号或双引号括起来的文本。要在范围内链接与正则表达式匹配的每个文本实例,请使用regex=string。如果未指定这些属性,则将链接整个范围。

使用target参数指定目标。其值的形式与标准内联{@link ...}标签使用的形式相同。


JDK 18中引入。

@spec

  • @spec URL title

通过其URL和标题标识外部规范。URL可以是绝对的或相对的。相对URL将根据“基本URL”进行评估。

指定相同URL的所有标签必须提供相同的对应标题;反之,具有不同URL的标签必须具有不同的标题。

JDK 20中引入。

{@summary}

  • {@summary text }

标识API描述的摘要,作为识别和使用API描述第一句的默认策略的替代方案。该标签仅在主描述的开头使用时才具有意义。在所有情况下,该标签的呈现方式是简单地呈现其内容。

JDK 10中引入。

{@systemProperty}

  • {@systemProperty property-name }

property-name标识为系统属性的名称。名称应为“点分标识符”。特别是,它不得包含空格字符或诸如}之类的字符。标签中不允许其他内容;可能会将额外内容的可能性保留给将来使用。该标签可用于所有文档注释。

JDK 12中引入。

@throws

  • @throws exception-name description

向“Throws”部分添加指定名称的异常,后跟指定的描述。

exception-name应该引用可能由方法抛出的异常,并且应该是异常类的名称或类型变量。此标签仅在方法或构造函数的文档注释中有效。

文档注释可以使用多个相同或不同异常的@throws标签。

为了确保所有已检查的异常都有文档,当在throws子句中不存在异常的@throws标签时,标准doclet会将该异常添加到生成的输出中(没有描述),就好像使用@throws标签记录了该异常一样。

从重写的方法复制@throws文档到子类仅当异常在重写的方法中明确声明时才会发生。从接口方法复制到实现方法也是如此。您可以使用{@inheritDoc}标签来强制@throws标签继承文档。

@exception标签等效于此标签,尽管现在推荐使用@throws形式。

JDK 1.2中引入。

@uses

  • @uses service-type description

此标签仅可出现在模块声明的文档注释中,并用于记录模块可能使用的服务。描述可用于指定可能需要的服务的特征,以及如果找不到服务的提供程序模块将执行的操作。

JDK 9中引入。

{@value}

  • {@value format field-reference }

显示具有编译时常量值的静态字段的值。

格式字符串可以省略,此时将使用默认格式,适合字段类型。如果给出格式字符串,则它必须以百分号字符(%)开头或用双引号字符(")括起来。它必须恰好包含一个百分号字符。字符串必须符合格式字符串的定义,如java.util.Formatter的文档中指定的那样。格式字符串中指定的转换必须适合常量值的类型。

当在静态字段的文档注释中使用{@value}标签而没有field_reference参数时,它将显示该常量的值:

/**
 * 此常量的值为{@value}。
 */
public static final String SCRIPT_START = "<script>"

在任何文档注释中使用带有field-reference参数时,{@value}标签将显示指定常量的值:

/**
 * 评估从{@value #SCRIPT_START}开始的脚本。
 */
public String evalScript(String script) {}

JDK 1.4中引入;JDK 20中添加了format

@version

  • @version version-text

将带有指定version-text值的“版本”子标题添加到使用-version选项时生成的文档中。此标签旨在保存此代码所属软件的当前发布号,而不是@since标签保存引入此代码的发布号。 version-text值没有特殊的内部结构。

文档注释可以包含多个@version标签。在有意义的情况下,您可以为每个@version标签指定一个发布号或一个标签中的多个发布号。在前一种情况下,标准doclet在名称之间插入逗号(,)和空格。在后一种情况下,整个文本将被复制到生成的文档中而不进行解析。因此,当您希望使用除逗号之外的本地化分隔符时,可以在一行中使用多个名称。

JDK 1.0中引入。

标签可用的位置

以下表总结了哪些标签可以在哪些上下文中使用。

标签可用的上下文
标签 模块 类型 构造函数 方法 字段 其他
@author
{@code}
@deprecated
{@docRoot}
@exception
@hidden
{@index}
{@inheritDoc}
{@link}
{@linkplain}
{@literal}
@param
@provides
@return
@see
@serial
@serialData *
@serialField *
@since
{@snippet}
{@summary}
{@systemProperty}
@throws
@uses
{@value}
@version

注意:

  • 方法 包括注解接口的成员。
  • 字段 包括枚举类的成员。
  • 其他 包括概述页面,该页面与任何声明无关,以及包目录的doc-files子目录中的HTML文件。概述页面通常是使用javadoc命令的选项指定的。
  • @serialData 只能用于readObjectwriteObjectreadExternalwriteExternalreadResolvewriteReplace 方法的文档注释中。
  • @serialField 只能用于serialPersistentFields 字段的文档注释中。