使用Python javalang解析Java文件遇异常及构造方法识别问题
Java代码解析问题解决思路
一、让javalang识别构造方法
javalang将构造方法与普通方法划分为不同节点类型:构造方法对应javalang.tree.ConstructorDeclaration,普通方法对应javalang.tree.MethodDeclaration。你的代码当前仅过滤MethodDeclaration节点,因此无法捕获构造方法。
修改解析逻辑的具体步骤:
- 同时过滤两种节点类型,遍历构造方法和普通方法
- 构造方法名称与所属类名称一致,需从父类节点中获取类名
替换JLCodeAnalyzer类start方法中遍历方法的代码片段:
methods = {} # 同时过滤构造方法和普通方法节点 for _, node in tree.filter((javalang.tree.MethodDeclaration, javalang.tree.ConstructorDeclaration)): if isinstance(node, javalang.tree.ConstructorDeclaration): # 向上遍历找到所属类节点,获取类名作为构造方法名 class_node = None for path, _ in tree: if isinstance(path[-1], javalang.tree.ClassDeclaration) and node in path[-1].body: class_node = path[-1] break method_name = class_node.name if class_node else "unknown_constructor" else: method_name = node.name startpos, endpos, startline, endline = self.get_method_start_end(node, tree) method_text, startline, endline, lex = self.get_method_text(startpos, endpos, startline, endline, lex, codelines, tree) methods[method_name] = method_text
修改后即可同时收集普通方法与构造方法的信息,后续统计行数的逻辑可直接复用现有代码。
二、解析Maven来源Java文件的语法错误问题
你拿到的Java文件是反编译后的字节码产物,并非Maven仓库中的原始源码:
- 代码顶部的
Decompiled with CFR 0.152.标注说明这是CFR反编译工具生成的代码 1.$assertionsDisabled是反编译工具的错误输出:Java编译断言时会生成合成的$assertionsDisabled静态字段,字节码中直接访问该字段,但反编译工具错误地将类名替换为1,导致语法不合法
解决办法:
- 获取原始源码:在Maven依赖中添加
<classifier>sources</classifier>,下载对应的源码包,其中是符合语法规范的原始Java代码 - 预处理反编译代码:若只能使用现有文件,可通过文本替换修复语法错误,比如将所有
1.$assertionsDisabled替换为$assertionsDisabled(或对应类名+.$assertionsDisabled),再交给javalang解析
内容的提问来源于stack exchange,提问作者Bog Alt
相关产品推荐
相关产品推荐

