利用jdk的tools.jar提供的接口,便可轻松获取java类的文档注释。
如类、构造方法、普通方法、成员属性等,都可以获得其注释相关信息。
1.添加依赖
<dependency>
<groupId>com.sun</groupId>
<artifactId>tools</artifactId>
<version>1.8</version>
<scope>system</scope>
<systemPath>${java.home}/../lib/tools.jar</systemPath>
</dependency>
2.使用示例
import cn.hutool.core.util.ReflectUtil;
import com.sun.javadoc.ClassDoc;
import com.sun.javadoc.FieldDoc;
import com.sun.javadoc.MethodDoc;
import com.sun.javadoc.RootDoc;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 获取某一个java文件代码中属性对应的注释
*
*/
public class Doclet {
public static Logger logger = LoggerFactory.getLogger(Doclet.class);
private static RootDoc rootDoc;
private final String clsFilePath;
// 必须要有,且必须如下定义
public static boolean start(RootDoc root) {
rootDoc = root;
return true;
}
public Doclet(String clsFilePath) {
this.clsFilePath = clsFilePath;
}
public void exec() {
com.sun.tools.javadoc.Main.execute(
new String[]{"-doclet", Doclet.class.getName(),
"-docletpath", Doclet.class.getResource("/").getPath(),
"-encoding", "utf-8",
clsFilePath});
ClassDoc[] classes = rootDoc.classes();
if (classes == null || classes.length == 0) {
logger.warn(clsFilePath + " 无ClassDoc信息");
return;
}
ClassDoc classDoc = classes[0];
// 获取类的名称
System.err.println("类名:" + classDoc.name());
// 获取类的注释
String classComment = ReflectUtil.getFieldValue(classDoc, "documentation").toString();
System.err.println("类注释:" + classComment);
// 获取属性名称和注释
for (FieldDoc field : classDoc.fields(false)) {
System.err.printf("属性名:%s, 属性类型:%s, 注释:%s%n", field.name(), field.type().typeName(), field.commentText());
}
for (MethodDoc method : classDoc.methods(false)) {
System.err.printf("方法名:%s, 方法返回类型:%s, 注释:%s%n", method.name(), method.returnType().typeName(), method.commentText());
}
}
public static void main(String[] args) {
Doclet doclet = new Doclet(
"E:\\git\\DLMS\\dlms\\dlms-option\\dlms-option-prevent-duplicate\\src\\main\\java\\com\\gynsh\\prevent\\annotation\\PreventDuplicate.java");
doclet.exec();
}
}