遍歷目錄查找Java文件:
public static void ergodicDir(File dir, HashSet<String> argNameSet, HashSet<String> classNameSet, ArrayList<Integer> record) {
if(dir.isDirectory()){
for(File file : dir.listFiles()){
if(file.isDirectory()){
ergodicDir(file, argNameSet, classNameSet, record);
}
if(file.isFile() && file.getName().endsWith("java")){
Jparser.parser(file, argNameSet, classNameSet, record);
}
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
解釋:
本方法參數列表中的dir為要查找的目錄;argNameSet用作記錄方法形參列表中的參數名;classNameSet用作記錄類名;record用作統計總的文件個數與不能解析的文件個數。
本方法中調用了Jparser類中的parser方法對指定Java文件進行解析,獲得Java代碼中的類名、方法形參列表中的參數名。
Jparser類中的parser方法:
public static void parser(File inFile, HashSet<String> argNameSet, HashSet<String> classNameSet, ArrayList<Integer> record) {
try{
System.out.println(inFile.toString());
record.set(0, record.get(0) + 1);
//將一個java代碼的文本解析為一棵CompilationUnit類型的樹
CompilationUnit unit = JavaParser.parse(inFile);
VoidVisitor<HashSet<String>> methodArgsNameCollector = new MethodArgsNameCollector();
VoidVisitor<HashSet<String>> classNameCollector = new ClassNameCollector();
//在指定的樹上進行搜索,然后根據遇到的節點的類型調用具體的回調
methodArgsNameCollector.visit(unit, argNameSet);
classNameCollector.visit(unit, classNameSet);
} catch (Exception e) {
record.set(1, record.get(1) + 1);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
解釋:
本方法中將record[0]用作記錄總的文件個數,record[1]用作記錄不能解析的文件個數。
CompilationUnit unit = JavaParser.parse(inFile);將指定的java文件生成AST(抽象語法樹)。
VoidVisitor<HashSet<String>> methodArgsNameCollector = new MethodArgsNameCollector();與VoidVisitor<HashSet<String>> classNameCollector = new ClassNameCollector();分別創建獲取Java代碼中的方法形參列表中的參數名的VoidVisitor對象以及獲取類名的VoidVisitor對象。
methodArgsNameCollector.visit(unit, argNameSet);與classNameCollector.visit(unit, classNameSet);分別在指定的AST上進行搜索,根據遇到的節點的類型調用具體的回調。
MethodArgsNameCollector類
public class MethodArgsNameCollector extends VoidVisitorAdapter<HashSet<String>> {
@Override
public void visit(MethodDeclaration md, HashSet<String> argNameSet) {
NodeList<Parameter> parameters = md.getParameters();
for (Parameter parameter : parameters) {
argNameSet.add(String.valueOf(parameter.getName()));
}
super.visit(md, argNameSet);
}
}
1
2
3
4
5
6
7
8
9
10
解釋:
MethodDeclaration.getParameters()獲得包含方法形參列表中所有參數節點的列表。
parameter.getName()獲得對應參數的參數名。
ClassNameCollector類
public class ClassNameCollector extends VoidVisitorAdapter<HashSet<String>> {
@Override
public void visit(ClassOrInterfaceDeclaration cORid, HashSet<String> classNameSet) {
classNameSet.add(cORid.getNameAsString());
super.visit(cORid, classNameSet);
}
}
1
2
3
4
5
6
7
解釋:
ClassOrInterfaceDeclaration.getNameAsString()獲得類名