遍历目录查找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. 大名鼎鼎的UniDAC手工安装

    第一次开博,该写点什么.由于懒,很多事情,都不想动.不过,懒不能解决遗忘的毛病.还是动手,记录一下吧. 好了,言归主题. UniDAC 的手工安装. 现在Delphi,已经发展到了XE6,支持多种移动 ...

  2. NazoHell 攻略

    http://hell.one-story.cn/hell-start.html Level 0: http://nazohell.one-story.cn/nazohell-start.html 跳 ...

  3. Jq如何获取并操作iframe中的元素?

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  4. [LeetCode] 34. Search for a Range 搜索一个范围(Find First and Last Position of Element in Sorted Array)

    原题目:Search for a Range, 现在题目改为: 34. Find First and Last Position of Element in Sorted Array Given an ...

  5. [LeetCode] 346. Moving Average from Data Stream 从数据流中移动平均值

    Given a stream of integers and a window size, calculate the moving average of all integers in the sl ...

  6. springboot-把web项目打成war包部署到外部tomcat

    将打包方式修改为war <packaging>war</packaging> 移除tomcat依赖或者将tomcat依赖scope改为provide 移除tomcat依赖 &l ...

  7. mysql执行计划详解,

    一.语法 explain SQL语句 例如: explain ; 二.explain输出解释 +----+-------------+-------+-------+----------------- ...

  8. Python2.7+virtualenv+CUDA 10.0版的pytorch v1.3.0 +运行人群计数crowdcount-mcnn网络

    Python2.7$ python2 -m virtualenv pytorchenv$ source pytorchenv/bin/activate $ pip install ipython py ...

  9. 34 多线程(六)——线程安全 synchronized

    关键字synchronized可以写在方法和代码块中 写在普通方法中:锁住的对象是this,即类的实例.也就是说锁住的是类下面的类变量(成员变量),而不是方法中的变量. 写在静态方法中:锁住的对象时c ...

  10. PAT(B) 1085 PAT单位排行(Java:20分)

    题目链接:1085 PAT单位排行 (25 point(s)) 题目描述 每次 PAT 考试结束后,考试中心都会发布一个考生单位排行榜.本题就请你实现这个功能. 输入格式 输入第一行给出一个正整数 N ...