我正在编写一段Java代码分析片段,用于查找方法中变量的使用情况(具体来说,是全局类变量在方法中被读取和写入的次数)。是否可以使用JavaParser完成这个任务?还有其他推荐吗?有人知道如何计算类度量吗?它们可能涉及类似的内容。
我正在编写一段Java代码分析片段,用于查找方法中变量的使用情况(具体来说,是全局类变量在方法中被读取和写入的次数)。是否可以使用JavaParser完成这个任务?还有其他推荐吗?有人知道如何计算类度量吗?它们可能涉及类似的内容。
谢谢大家。你们的回答都让我朝着使用JAVAPARSER中的AST实现解决这个问题的方向前进。下面是一个代码片段,希望能帮助到其他人。
class CatchNameExpr extends VoidVisitorAdapter {
HashMap<String, ArrayList<Integer>> variableLineNumMap;``
ArrayList<String> variableList;
boolean functionParsing = false;
public CatchNameExpr(ArrayList<String> classVariables) {
variableList=classVariables;
}
public void visit(MethodDeclaration method, Object arg) {
System.out.println("---------------");
System.out.println(method.getName());
System.out.println("---------------");
variableLineNumMap = new HashMap<String, ArrayList<Integer>>();
System.out.println();
functionParsing = true;
visit(method.getBody(),arg);
// Analyze lines for variable usage. Add to list of vars after checking if its read or written or unknown.
functionParsing = false;
}
public void visit(NameExpr n, Object arg) {
if(!functionParsing)
return;
//TODO: check if this var was declared above it, as a local var to the func. if yes, return
ArrayList<Integer> setOfLineNum;
System.out.println(n.getBeginLine()+" NameExpr " + n.getName());
if(!variableList.contains(n.getName()) || n.getName().length()==0)
return;
if (!variableLineNumMap.containsKey(n.getName()))
{
setOfLineNum = new ArrayList<Integer>();
setOfLineNum.add(n.getBeginLine());
variableLineNumMap.put(n.getName(), setOfLineNum);
}
else
{
setOfLineNum = variableLineNumMap.get(n.getName());
setOfLineNum.add(n.getBeginLine());
variableLineNumMap.put(n.getName(), setOfLineNum);
}
}
}
实例化该类 --->
CatchNameExpr nameExp = new CatchNameExpr(classVariables);
nameExp.visit(classCompilationUnit, null);
Expression
类型?https://stackoverflow.com/questions/28851648/ - towi