【转】使用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 ...
随机推荐
- 通过ssh登录到手机 Termux
安装Termux Termux官网:https://termux.com/ 安装openssh 安装好Termux后,点击图标进入,依次输入以下命令. 申请读写权限 termux-setup-stor ...
- ajax提交json数据到后端C#解析
本文链接:https://blog.csdn.net/qq_22103321/article/details/78015920 前端提交json数据 $.ajax({ type: "post ...
- centos 如何修改docker镜像和容器的默认存放路径
原因:通过df -h查看磁盘利用的时候,目前挂载的太小了,所以尝试挂载到其他地方 1 先看看默认存放的路径在哪儿 方法1:docker info 方法2:sudo docker info | grep ...
- 05 javascript知识点---BOM和DOM
1.DOM简单学习(为了满足案例要求) 功能:控制html文档的内容获取页面标签(元素)对象:Element document.getElementById("id值"):通过元素 ...
- setInterval定时器停止后,再重新启动
1.数据自动滚动显示(动态添加) <li> <div class="FULeTi"> <div class="SLeName"&g ...
- 【转帖】5G基站建设下的“中国速度”:北上广深领跑全国,均超1万个
5G基站建设下的“中国速度”:北上广深领跑全国,均超1万个 https://www.laoyaoba.com/html/news/newsdetail?source=pc&news_id=73 ...
- Inno Setup 检测已安装的.NET Framework 版本
翻译自:http://kynosarges.org/DotNetVersion.html 由 Jordan Russell 写的 Inno Setup 是一个伟大的安装脚本程序,但缺乏一个内置的函数来 ...
- gentoo emerge简单用法
包管理工具 包的命名 gentoo中每个包名包含两部分,组名与包名,如:dev-db/redis,dev-db是组名,redis是包名或者称库名. 安装搜索时需要指定包的名称,一般不需要输入组名, 但 ...
- RabbitMQ延迟消息队列实现定时任务完整代码示例
- golang ---获取内存信息
package main import ( "fmt" "syscall" "unsafe" ) var kernel = syscall. ...