• 【转】使用JavaParser获得Java代码中的类名、方法形参列表中的参数名以及统计总的文件个数与不能解析的文件个数


    遍历目录查找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()获得类名

  • 相关阅读:
    初识Ubuntu 18.04(更换系统头像,截图,sy)
    HDU
    HDU
    进度1
    开课博客
    返回一个整数数组中最大子数组的和
    开学第一节课测试感受
    网页记账本开发四(基本完成)
    网页记账本开发三
    网页记账本开发二
  • 原文地址:https://www.cnblogs.com/exmyth/p/11396508.html
Copyright © 2020-2023  润新知