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

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

  1. Eclipse远程调试Java代码的三种方法

    Eclipse远程调试Java代码的三种方法, 第1种方法是用来调试已经启动的Java程序,Eclipse可以随时连接到远程Java程序进行调试, 第2种方法可以调试Java程序启动过程,但是Ecli ...

  2. Day07_39_集合中的remove()方法 与 迭代器中的remove()方法

    集合中的remove()方法 与 迭代器中的remove()方法 深入remove()方法 iterator 中的remove()方法 collection 中的remove(Object)方法 注意 ...

  3. JQ中的clone()方法与DOM中的cloneNode()方法

    JQ中的clone()方法与DOM中的cloneNode()方法 cloneNode()定义和用法 cloneNode()方法创建节点的拷贝,并返回该副本. 语法: node.cloneNode(de ...

  4. 使用size()方法输出列表中的元素数量。需要注意的是,这个方法返回的值可能不是真实的,尤其当有线程在添加数据或者移除数据时,这个方法需要遍历整个列表来计算元素数量,而遍历过的数据可能已经改变。仅当没有任何线程修改列表时,才能保证返回的结果是准确的。

    使用size()方法输出列表中的元素数量.需要注意的是,这个方法返回的值可能不是真实的,尤其当有线程在添加数据或者移除数据时,这个方法需要遍历整个列表来计算元素数量,而遍历过的数据可能已经改变.仅当没 ...

  5. JS中split使用方法和数组中元素的删除

    JS中split使用方法和数组中元素的删除 JS中split使用方法 <script language="javascript"> function spli(){ d ...

  6. Spring Boot 使用Java代码创建Bean并注册到Spring中

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/catoop/article/details/50558333 声明同一个类下的多个实例: packa ...

  7. (41)Spring Boot 使用Java代码创建Bean并注册到Spring中【从零开始学Spring Boot】

    已经好久没有讲一些基础的知识了,这一小节来点简单的,这也是为下节的在Spring Boot中使用多数据源做准备. 从Spring 3.0开始,增加了一种新的途径来配置Bean Definition,这 ...

  8. [改善Java代码]不推荐使用binarySearch对列表进行检索

    对一个列表进行检索时,我们使用的最多的是indexOf方法,它简单好用,而且也不会出错,虽然它只能检索到第一个符合条件的值,但是我们可以生成子列表后再检索.这样也就可以查找到所有符合条件的值了. Co ...

  9. [改善Java代码]避开基本类型数组转换列表陷阱

    开发中经常用到Arrays和Collections这两个工具类. 在数组和列表之间进行切换.非常方便.但是也会遇到一些问题. 看代码: import java.util.Arrays; import ...

随机推荐

  1. spring security实现记住我下次自动登录功能

    目录 spring security实现记住我下次自动登录功能 一.原理分析 二.实现方式 2.1 简单实现方式 2.2 数据库实现方式 三.区分是密码登录还是rememberme登录 spring ...

  2. jqGrid设置单选

    beforeSelectRow: function() { $(this).jqGrid('resetSelection'); return true; }

  3. vue中$router以及$route的使用

    路由基本概念 route,它是一条路由. { path: '/home', component: Home } routes,是一组路由. const routes = [ { path: '/hom ...

  4. Apache Kafka教程

    1.卡夫卡教程 今天,我们正在使用Apache Kafka Tutorial开始我们的新旅程.在这个Kafka教程中,我们将看到什么是Kafka,Apache Kafka历史以及Kafka的原因.此外 ...

  5. proc 目录介绍

    /proc/apm  高级电源管理(APM)版本信息及电池相关状态信息,通常由apm命令使用: /proc/buddyinfo  用于诊断内存碎片问题的相关信息文件: /proc/cmdline  在 ...

  6. Java开发笔记(一百零五)几种定时器线程池

    前面介绍了普通线程池的用法,就大多数任务而言,它们对具体的执行时机并无特殊要求,最多是希望早点跑完早点出结果.不过对于需要定时执行的任务来说,它们要求在特定的时间点运行,并且往往不止运行一次,还要周期 ...

  7. Django模板语言中静态文件路径的灵活写法

    如图,我们看到的时html页面中静态文件的路径,其中/static/是settings.py中的设置: 假设我们将settings.py中的/static/改变了,这样的话我们还需要将html中的/s ...

  8. Js学习04--对象

    1.如何辨别js中的对象 除了五种基本的数据类型,其他的都是对象.万物皆对象. 2.Js中对象的分类 1)内建对象 由ES标准定义的对象,在任何的ES实现中都可以使用. eg:String.Numbe ...

  9. HTML学习--基础知识

    WEB a)       什么是WEB WEB,是基于Internet上的一种应用程序(网页应用程序),WEB页面,简称WEB页(网页),就是保存在服务器端上的一个具体的页面 b)       WEB ...

  10. [SOJ #537]不包含 [CF102129I]Incomparable Pairs(2019-8-6考试)

    题目大意:给定一个长度为$n$的字符串$s$,求有多少个无序字符串二元组$(x,y)$满足:$x,y$是$s$的字串,且$x$不是$y$的字串,$y$不是$x$的字串 题解:发现满足$x,y$是$s$ ...