我正在使用 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() 将返回枚举常量。