我正在使用JDK 1.7编写全新的自定义Doclet。这些是我到目前为止发现的问题:
DOC方法isAnnotationType()
,isAnnotationTypeElement()
,isEnum()
和isEnumConstant()
不起作用。他们总是返回false 。
PackageDoc
方法enums()
不起作用。它总是返回一个空数组。Enums
包括allClasses()
和ordinaryClasses()
的结果。
ClassDoc
方法enumConstants()
不起作用。它总是返回一个空数组。Enum
常数包含在方法fields()
的结果中。
PackageDoc
方法annotationTypes()
不起作用。总是返回一个空数组。Annotations
包括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/guides/javadoc/javadoc/whatsnew-1.5.0.5.0.html)我猜想,即使我使用JDK 1.7编写它,我的doclet仍在某种前5.0兼容模式下工作。这就是我在" Javadoc 5.0中的新事物"页面中发现的内容:
与自定义Doclets
不兼容在5.0之前编写的自定义doclet在使用5.0中使用新语言功能的源文件上运行时,将存在兼容性问题。新语言功能:Doclet API和标准Doclet进行了修订,以处理新的5.0语言功能 - 仿制药,枚举,varargs和注释。为了处理这些功能,还需要修改自定义doclet。Javadoc工具在可能的范围内尝试出示所谓的"遗产" doclets,以了解该程序 1)继续使用5.0前源代码,并且 2)匹配他们对5.0源代码的期望。因此,例如,类型参数和类型参数是从通用构造中剥离的,类型变量和通配符类型被其擦除取代,classDoc.fields()将返回枚举常数。
解决!它确实在5.0前兼容模式下工作。我要做的就是将以下方法添加到我的自定义doclet:
public static LanguageVersion languageVersion() {
return LanguageVersion.JAVA_1_5;
}