zoukankan      html  css  js  c++  java
  • 【转】使用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()获得类名

  • 相关阅读:
    并发编程3
    并发编程2
    4/23
    4/22
    并发编程1
    粘包问题
    Navicat12激活
    IDEA创建maven项目报错解决:Failed to create a Maven project: 'C:/Users/../IdeaProjects/../pom.xml' already e
    IDEA
    windows下查看端口运行情况--解决端口冲突问题
  • 原文地址:https://www.cnblogs.com/exmyth/p/11396508.html
Copyright © 2011-2022 走看看