工作时有需求获取java文件成员变量的注释,故而研究了一系列开源产品,之所以选择JavaParse,是因为博客上文件比较多。。。
多归多,但也版本杂乱,走了不少歪路。
版本2.x和版本3.x还是有较大不同的,有需要的人可以参考。
版本2.xcom.github.javaparser javaparser-core 2.2.1
package cn.com.infosec.netseal.webserver.util;
import cn.com.infosec.netseal.common.util.StringUtils;
import com.github.javaparser.JavaParser;
import com.github.javaparser.ast.CompilationUnit;
import com.github.javaparser.ast.Node;
import com.github.javaparser.ast.body.TypeDeclaration;
import com.github.javaparser.ast.comments.Comment;
import java.io.File;
import java.util.List;
public class JavaParseTest {
public static void main(String[] args) throws Exception {
String classPath = "E:\Idea\NetSeal\v7\src\netseal\netseal-common\src\main\java\cn\com\infosec\netseal\common\resource\errCode\ErrSubType.java";
String mapName = "subTypeMap";
CompilationUnit parse = JavaParser.parse(new File(classPath));
// 获取指定文件中的所有类
List types = parse.getTypes();
for (TypeDeclaration type : types) {
// 获取类名/类注释
String className = type.getName();
type.getComment();
// 获取类里的变量、方法等子节点
List list = type.getChildrenNodes();
System.out.println("总个数:" + list.size());
for (Node node : list) {
if (node.toString().indexOf("(") != -1)
continue;
// 获取变量的类型、变量名称和变量值;
List varTypeAndKV = node.getChildrenNodes();
Node varKV = varTypeAndKV.get(1);
String varK = varKV.toString().split("=")[0].trim();
// 获取变量注释
String content = "";
Comment comment = node.getComment();
if (comment != null && comment.getContent() != "") {
content = comment.getContent().replace("*", "").trim();
}
System.out.println(StringUtils.format("{}.put({}.{}, "{}");", mapName, className, varK, content));
}
}
}
}
版本3.x
com.github.javaparser javaparser-core 3.6.16 compile
package cn.com.infosec.netseal.appserver.util;
import cn.com.infosec.netseal.common.util.StringUtils;
import com.alibaba.fastjson.JSON;
import com.github.javaparser.JavaParser;
import com.github.javaparser.ast.CompilationUnit;
import com.github.javaparser.ast.Node;
import com.github.javaparser.ast.NodeList;
import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
import com.github.javaparser.ast.body.FieldDeclaration;
import com.github.javaparser.ast.body.TypeDeclaration;
import com.github.javaparser.ast.body.VariableDeclarator;
import com.github.javaparser.ast.comments.Comment;
import com.github.javaparser.ast.expr.SimpleName;
import java.io.File;
import java.util.List;
import java.util.Optional;
public class JavaParseTest {
public static void main(String[] args) throws Exception {
String classPath = "E:\Idea\NetSeal\v7\src\netseal\netseal-common\src\main\java\cn\com\infosec\netseal\common\resource\errCode\ErrSubType.java";
String mapName = "subTypeMap";
CompilationUnit parse = JavaParser.parse(new File(classPath));
Optional errSubType = parse.getClassByName("ErrSubType");
errSubType.ifPresent((c) -> {
// 获取类名/类注释
String className = c.getName().toString();
c.getComment();
// 获取类里的变量、方法等子节点
List list = c.getChildNodes();
System.out.println("总个数:" + list.size());
for (Node nodeTmp : list) {
if (!(nodeTmp instanceof FieldDeclaration))
continue;
FieldDeclaration node = (FieldDeclaration) nodeTmp;
// 获取变量的类型、变量名称和变量值;
VariableDeclarator variable = node.getVariable(0);
String varName = variable.getNameAsString();
String varType = variable.getTypeAsString();
// 获取变量注释
String content = "";
Optional comment = node.getComment();
if (comment != null && comment.get().getContent() != "") {
content = comment.get().getContent().replace("*", "").trim();
}
System.out.println(StringUtils.format("{}.put({}.{}, "{}");", mapName, className, varName, content));
}
});
}
}



