遇到个需求,需要把一个类中的成员变量和变量对应的注释放在一个map中,但是由于变量上千个,所以挨个复制实在很麻烦,就想找能自动执行的程序,一开始用正则匹配,但是比较繁琐,然后也试了反射获取变量的方式,但是没取到注释,后来又被同事安利了Javaparser,百度了一番
Javaparser用来分析、转换、生成代码,提供了一个Java代码的抽象语法树
/**
* 解析单个Java文件
*
* @param cu 编译单元
*/
public static void parseOneFile(CompilationUnit cu) {
// 类型声明
NodeList<TypeDeclaration<?>> types = cu.getTypes();
for (TypeDeclaration<?> type : types) {
System.out.println("## " + type.getName());
// 成员,貌似getChildNodes方法也可行
NodeList<BodyDeclaration<?>> members = type.getMembers();
members.forEach(JavaParserUtil::processNode);
}
}
/**
* 处理类型,方法,成员
*
* @param node
*/
public static void processNode(Node node) {
if (node instanceof TypeDeclaration) {
// 类型声明
// do something with this type declaration
} else if (node instanceof MethodDeclaration) {
// 方法声明
// do something with this method declaration
String methodName = ((MethodDeclaration) node).getName().getIdentifier();
System.out.println("方法: " + methodName);
} else if (node instanceof FieldDeclaration) {
// 成员变量声明
// do something with this field declaration
// 注释
Comment comment = node.getComment().orElse(null);
// 变量
NodeList<VariableDeclarator> variables = ((FieldDeclaration) node).getVariables();
SimpleName fieldName = variables.get(0).getName();
String con = "";
if (comment != null) {
String content = comment.getContent();
con = content.replace("*", "").trim();
System.out.println(con);
}
System.out.print("\t");
System.out.print(fieldName);
System.out.println();
System.out.println(StringUtils.format("{}.put({}.{}, \"{}\");", "subTypeMap"," ErrSubType", fieldName, trim));
}
}
public static void main(String[] args) throws Exception {
String classPath = "I:\\IdeaWorks\\v7\\netseal\\netseal-common\\src\\main\\java\\cn\\com\\infosec\\netseal\\common\\resource\\errCode\\ErrSubType.java";
String mapName = "subTypeMap";
CompilationUnit cu = JavaParser.parse(new File(classPath));
parseOneFile(cu);
}