5

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

Doc methods isAnnotationType()isAnnotationTypeElement()isEnum()不起作用isEnumConstant()。他们总是返回 false

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

ClassDoc方法enumConstants()不起作用。它总是返回一个空数组Enum常量包含在方法的结果中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);
}

基于我在“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() 将返回枚举常量。

4

1 回答 1

5

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

public static LanguageVersion languageVersion() {
    return LanguageVersion.JAVA_1_5;
}
于 2014-01-20T17:43:38.403 回答