.java报告生成、方法调用程序&;被叫
欢迎来到互联网上最有帮助的社区 我正在做一个可以读取.java文件并输出数据的项目。我的一个提取数据的程序不能完全按照我的预期工作(非常老套)。它解析文件树中的所有.java文件,并使用linkedhashmap在.txt文件中列出调用者pkg.class.method和调用的pkg.class.method等数据它做的一切都很好,除了它只给我从一个方法调用的最后一个方法,而不是从每个方法调用的所有方法。我认为这是因为我在linkedhashmap中存储数据的方式,即一个键(调用方方法)和多个值(称为方法) 我希望文本文件列出从第一次遇到的每个方法开始调用的每个方法。有办法解决这个问题吗 代码如下:.java报告生成、方法调用程序&;被叫,java,javaparser,method-declaration,Java,Javaparser,Method Declaration,欢迎来到互联网上最有帮助的社区 我正在做一个可以读取.java文件并输出数据的项目。我的一个提取数据的程序不能完全按照我的预期工作(非常老套)。它解析文件树中的所有.java文件,并使用linkedhashmap在.txt文件中列出调用者pkg.class.method和调用的pkg.class.method等数据它做的一切都很好,除了它只给我从一个方法调用的最后一个方法,而不是从每个方法调用的所有方法。我认为这是因为我在linkedhashmap中存储数据的方式,即一个键(调用方方法)和多个值
import japa.parser.JavaParser;
import japa.parser.ast.CompilationUnit;
import japa.parser.ast.body.MethodDeclaration;
import japa.parser.ast.expr.MethodCallExpr;
import japa.parser.ast.visitor.VoidVisitorAdapter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.LinkedHashMap;
/*--------------------------------------------------------------------------------------------------
* TASK 3: Information Extraction, Method Caller and Method Callee
* This java code will extract data in 2 columns
* (Format:pkg.class.method). First column denotes the method
* from which another method is being called and the second
* column denotes the name of the called method.
*--------------------------------------------------------------------------------------------------
*/
public class Task3
{
private static HashMap<String,String> methods = new LinkedHashMap<String,String>();
static class ClassVisitor extends VoidVisitorAdapter<Object>
{
private static String className = "";
public void visit(japa.parser.ast.body.ClassOrInterfaceDeclaration n, Object arg)
{
className = arg + "," + n.getName();
new MethodVisitor().visit(n, className);
}
}
static class MethodVisitor extends VoidVisitorAdapter<Object> {
private static String methodName = "";
@Override
public void visit(MethodDeclaration n, Object arg)
{
methodName = arg + "," + n.getName();
new MethodCallVisitor().visit(n,methodName);
}
}
static class MethodCallVisitor extends VoidVisitorAdapter<Object>{
@Override
public void visit(MethodCallExpr n, Object arg)
{
String className=arg.toString();
methods.put(arg.toString(),className.substring(0,className.lastIndexOf(','))+","+n.getName());
}
}
public static void main(String[] args)
{
try
{
ListFiles files = new ListFiles();
String projPath = "C:\\JavaBook\\Final\\JMencode_v0.64_src\\";
Path file = Paths.get(projPath);
Files.walkFileTree(file, files);
CompilationUnit compilationUnit = null;
FileInputStream fileInputStream = null;
String pkg = "";
ClassVisitor codeVisitor = null;
for (Path path : files.javaFiles)
{
fileInputStream = new FileInputStream(path.toFile());
try
{
compilationUnit = JavaParser.parse(fileInputStream);
}
finally
{
fileInputStream.close();
}
pkg = compilationUnit.getPackage().getName().toString();
codeVisitor = new ClassVisitor();
codeVisitor.visit(compilationUnit, pkg);
}
File ouputFile = new File("C:\\JavaBook\\Final\\src\\pkg\\Task_1_2_3\\JMencode_v0.64_src_task3_" + methods.size() + ".txt");
FileWriter fW = new FileWriter(ouputFile);
fW.write("Caller Method" + " \t\t\t " + "Callee Method\n");
for (String callerMeth : methods.keySet())
{
fW.write(callerMeth + " \t\t\t "+ methods.get(callerMeth)+"\n");
System.out.println(callerMeth + " \t\t\t " + methods.get(callerMeth)+"\n");
}
fW.close();
}
catch (Exception ex)
{
System.out.println("Exception in ProjectInfo " + ex.getMessage());
}
}
}
import japa.parser.JavaParser;
导入japa.parser.ast.compileUnit;
导入japa.parser.ast.body.MethodDeclaration;
导入japa.parser.ast.expr.MethodCallExpr;
导入japa.parser.ast.visitor.VoidVisitorAdapter;
导入java.io.File;
导入java.io.FileInputStream;
导入java.io.FileWriter;
导入java.nio.file.Files;
导入java.nio.file.Path;
导入java.nio.file.path;
导入java.util.HashMap;
导入java.util.LinkedHashMap;
/*--------------------------------------------------------------------------------------------------
*任务3:信息提取、方法调用方和方法被调用方
*此java代码将在两列中提取数据
*(格式:pkg.class.method)。第一列表示方法
*从中调用另一个方法和第二个
*列表示被调用方法的名称。
*--------------------------------------------------------------------------------------------------
*/
公开课任务3
{
私有静态HashMap方法=新LinkedHashMap();
静态类ClassVisitor扩展了VoidVisitorAdapter
{
私有静态字符串className=“”;
公共无效访问(japa.parser.ast.body.classor接口声明n,对象arg)
{
className=arg+,“+n.getName();
newmethodvisitor().visit(n,类名);
}
}
静态类MethodVisitor扩展了VoidVisitorAdapter{
私有静态字符串methodName=“”;
@凌驾
公共无效访问(方法声明n,对象参数)
{
methodName=arg+,“+n.getName();
新建MethodCallVisitor().visit(n,methodName);
}
}
静态类MethodCallVisitor扩展了VoidVisitorAdapter{
@凌驾
公共无效访问(MethodCallExpr n,对象arg)
{
字符串className=arg.toString();
方法.put(arg.toString(),className.substring(0,className.lastIndexOf('),'))+“,”+n.getName());
}
}
公共静态void main(字符串[]args)
{
尝试
{
ListFiles=新建ListFiles();
String projPath=“C:\\JavaBook\\Final\\JMencode\u v0.64\u src\\”;
Path file=Path.get(projPath);
walkFileTree(文件,文件);
CompilationUnit CompilationUnit=null;
FileInputStream FileInputStream=null;
字符串pkg=“”;
ClassVisitor codeVisitor=null;
for(路径:files.javaFiles)
{
fileInputStream=新的fileInputStream(path.toFile());
尝试
{
compilationUnit=JavaParser.parse(fileInputStream);
}
最后
{
fileInputStream.close();
}
pkg=compilationUnit.getPackage().getName().toString();
codeVisitor=新类Visitor();
代码访问者访问(pkg编译单元);
}
File-ouputFile=new文件(“C:\\JavaBook\\Final\\src\\pkg\\Task\u 1\u 2\u 3\\JMencode\u v0.64\u src\u task3”+methods.size()+“.txt”);
FileWriter fW=新的FileWriter(输出文件);
fW.write(“调用方方法”+”\t\t\t“+”被调用方方法\n”);
for(字符串callerMeth:methods.keySet())
{
write(callerMeth++“\t\t\t”+methods.get(callerMeth)+“\n”);
System.out.println(callerMeth+“\t\t\t”+方法.get(callerMeth)+“\n”);
}
fW.close();
}
捕获(例外情况除外)
{
System.out.println(“ProjectInfo中的异常”+ex.getMessage());
}
}
}
提前谢谢大家 在这种情况下,有多个值具有相同的键,因此您应该像下面这样声明方法映射:
private static HashMap<String, Set<String>> methods = new LinkedHashMap<String, Set<String>>();
private static HashMap methods=newlinkedhashmap();
并将值存储在一个集合中:
Set<String> set = methods.get(arg.toString());
if (set == null) {
set = new HashSet<String>();
methods.put(arg.toString(), set);
}
set.add(className.substring(0,className.lastIndexOf(','))+","+n.getName());
Set=methods.get(arg.toString());
if(set==null){
set=新的HashSet();
方法.put(arg.toString(),set);
}
add(className.substring(0,className.lastIndexOf(','))+“,+n.getName());
可以考虑使用新的JavaPracServer版本来维护GITHUB()。您正在使用的版本已经多年没有维护了,它支持Java1.5,而当前版本支持Java1。8@kalame04-我在“ListFiles files=new ListFiles();”中遇到错误-请共享完整代码。