【转】使用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()获得类名
【转】使用JavaParser获得Java代码中的类名、方法形参列表中的参数名以及统计总的文件个数与不能解析的文件个数的更多相关文章
- Eclipse远程调试Java代码的三种方法
Eclipse远程调试Java代码的三种方法, 第1种方法是用来调试已经启动的Java程序,Eclipse可以随时连接到远程Java程序进行调试, 第2种方法可以调试Java程序启动过程,但是Ecli ...
- Day07_39_集合中的remove()方法 与 迭代器中的remove()方法
集合中的remove()方法 与 迭代器中的remove()方法 深入remove()方法 iterator 中的remove()方法 collection 中的remove(Object)方法 注意 ...
- JQ中的clone()方法与DOM中的cloneNode()方法
JQ中的clone()方法与DOM中的cloneNode()方法 cloneNode()定义和用法 cloneNode()方法创建节点的拷贝,并返回该副本. 语法: node.cloneNode(de ...
- 使用size()方法输出列表中的元素数量。需要注意的是,这个方法返回的值可能不是真实的,尤其当有线程在添加数据或者移除数据时,这个方法需要遍历整个列表来计算元素数量,而遍历过的数据可能已经改变。仅当没有任何线程修改列表时,才能保证返回的结果是准确的。
使用size()方法输出列表中的元素数量.需要注意的是,这个方法返回的值可能不是真实的,尤其当有线程在添加数据或者移除数据时,这个方法需要遍历整个列表来计算元素数量,而遍历过的数据可能已经改变.仅当没 ...
- JS中split使用方法和数组中元素的删除
JS中split使用方法和数组中元素的删除 JS中split使用方法 <script language="javascript"> function spli(){ d ...
- Spring Boot 使用Java代码创建Bean并注册到Spring中
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/catoop/article/details/50558333 声明同一个类下的多个实例: packa ...
- (41)Spring Boot 使用Java代码创建Bean并注册到Spring中【从零开始学Spring Boot】
已经好久没有讲一些基础的知识了,这一小节来点简单的,这也是为下节的在Spring Boot中使用多数据源做准备. 从Spring 3.0开始,增加了一种新的途径来配置Bean Definition,这 ...
- [改善Java代码]不推荐使用binarySearch对列表进行检索
对一个列表进行检索时,我们使用的最多的是indexOf方法,它简单好用,而且也不会出错,虽然它只能检索到第一个符合条件的值,但是我们可以生成子列表后再检索.这样也就可以查找到所有符合条件的值了. Co ...
- [改善Java代码]避开基本类型数组转换列表陷阱
开发中经常用到Arrays和Collections这两个工具类. 在数组和列表之间进行切换.非常方便.但是也会遇到一些问题. 看代码: import java.util.Arrays; import ...
随机推荐
- 安装hbase分布式集群出现的报错- ERROR:org.apache.hadoop.hbase.PleaseHoldException: Master is initializing
可能的原因如下: 1. 时间没有同步 HBase需要结点间的时间必须是同步的,可以使用date命令在Linux查看时间(同步时间命令:ntpdate 1.cn.pool.ntp.org) 2. 底层采 ...
- Oracle和Mysql中的字符串的拼接
SQL允许两个或者多个字段之间进行计算,字符串类型的字段也不例外.比如我们需要 以"工号+姓名"的方式在报表中显示一个员工的信息,那么就需要把工号和姓名两个字符 串类型的字段拼接计 ...
- A+B 和 C
给定区间 [−] 内的 3 个整数 A.B 和 C,请判断 A+B 是否大于 C. 输入格式: 输入第 1 行给出正整数 T (≤),是测试用例的个数.随后给出 T 组测试用例,每组占一行,顺序给出 ...
- [转帖]B树索引、位图索引和散列索引
B树索引.位图索引和散列索引 https://blog.csdn.net/huashanlunjian/article/details/84460436 索引在数据结构上可以分为三种B树索引.位图 ...
- pycharm django使用技巧
- 17.Python略有小成(包,logging模块)
Python(包,logging模块) 一.包 什么是包 官网解释 : 包是一种通过使用'.模块名'来组织python模块名称空间的方式 , 具体来讲 , 包就是一个包含有__ init __.py文 ...
- 我在LeetCode的首次刷题
到现在为止,我才发现我的博客一篇感受,心得,体会之言都没有. 今天就来随便扯扯. 刷题,是我最近一直在干的事情.也就每天写一两个.忘了就没写这种.也收藏了好几个刷题网站,当然第一次接触肯定是 WUST ...
- memcached源码分析二-lru
在前一篇文章中介绍了memcached中的内存管理策略slab,那么需要缓存的数据是如何使用slab的呢? 1. 缓存对象item内存分布 在memcached,每一个缓存的对象都使用一个ite ...
- 小贴士--Python
1.查看python安装好的包版本信息:pip list 原贴,有空完善.http://yangzb.iteye.com/blog/1824761 2.Python文件快速执行. 加头文件快速执行Py ...
- SAS学习笔记58 单元格格式化设计
单元格行_row_ 对于行单元格,主要就通过_row_这么一个自动变量的方式,来对单元格所有行进行格式化设计 例如,对性别为“男”的单元格所在行颜色设定为红色: 单元格列_col_ 将_row_改成_ ...