在自定义 doclet 中处理某些 5.0 语言功能(枚举和注释)的问题

Jor*_*ins 5 enums annotations javadoc doclet

我正在使用 JDK 1.7 编写一个全新的自定义 doclet。这些是我目前发现的问题:

文件的方法isAnnotationType()isAnnotationTypeElement()isEnum()并且isEnumConstant()不工作。他们总是返回 false

PackageDoc方法enums()不起作用。它总是返回一个空数组Enums包含在方法allClasses()和的结果中ordinaryClasses()

ClassDoc方法enumConstants()不起作用。它总是返回一个空数组Enum常量包含在 method 的结果中fields()

PackageDoc方法annotationTypes()不起作用。它总是返回一个空数组Annotations包含在 method 的结果中interfaces(),因此我可以实施以下解决方法:

AnnotationTypeDoc annotationDoc;
ClassDoc[] interfaces = packageDoc.interfaces();
for (ClassDoc classDoc : interfaces) {
if (classDoc instanceof AnnotationTypeDoc) {
    annotationDoc = (AnnotationTypeDoc) classDoc;
} else {
    continue;
}
process(annotationDoc);
}
Run Code Online (Sandbox Code Playgroud)

基于我在“Javadoc 5.0 的新增功能”页面(http://docs.oracle.com/javase/7/docs/technotes/guides/javadoc/whatsnew-1.5.0.html)中发现的内容,我猜即使我使用 JDK 1.7 编写它,我的 doclet 也在某种 5.0 之前的兼容模式下工作。这是我在“Javadoc 5.0 的新增功能”页面中找到的内容:

与自定义 Doclet 的不兼容

5.0 之前编写的自定义 doclet 在使用 5.0 中的新语言功能的源文件上运行时会出现兼容性问题。新的语言特性:Doclet API 和标准 doclet 被修订以处理新的 5.0 语言特性——泛型、枚举、可变参数和注释。为了处理这些功能,还需要修改自定义 doclet。Javadoc 工具试图——在可能的范围内——呈现所谓的“遗留”doclet,其中包含 1) 继续使用 5.0 之前的源代码,以及 2) 符合他们对 5.0 源代码的期望. 因此,例如,类型参数和类型参数从泛型构造中剥离,类型变量和通配符类型被它们的擦除替换,并且 ClassDoc.fields() 将返回枚举常量。

Jor*_*ins 5

解决了!它确实在 5.0 之前的兼容模式下工作。我所要做的就是将以下方法添加到我的自定义 doclet 中:

public static LanguageVersion languageVersion() {
    return LanguageVersion.JAVA_1_5;
}
Run Code Online (Sandbox Code Playgroud)