当前位置:网站首页>ASTParser 解析含有emum 枚举方法的类文件的踩坑记
ASTParser 解析含有emum 枚举方法的类文件的踩坑记
2022-07-02 09:32:00 【小生测试】
问题描述
使用ASTParser 解析含有emum 枚举方法的类文件时,解析的结果时错误的。比如下面的文件解析后method 数据含有以下四个,其中FULL_AMOUNT不是一个method,对应的行范围也是不准的,结果导致我们在影响面评估中,评估该方法有变动但却找不到的问题,使得调用链路分析评估不准确。
STATUS
FULL_AMOUNT
TYPE
getNameByCode
被解析java代码
import lombok.Getter;
@Getter
public class DicTaskEnum {
/**
* 状态
*/
@Getter
public enum STATUS {
/**
* 未执行
*/
NO_EXECUTION(1, "未执行"),
/**
* 执行中
*/
EXECUTING(0, "执行中"),
;
private final Integer code;
private final String name;
STATUS(Integer code, String name) {
this.code = code;
this.name = name;
}
public static String getNameByCode(Integer code) {
for (STATUS typeEnum : STATUS.values()) {
if (typeEnum.getCode().equals(code)) {
return typeEnum.getName();
}
}
return null;
}
}
/**
* 状态
*/
@Getter
public enum TYPE {
/**
* 全量
*/
FULL_AMOUNT("全量"),
/**
* 增量
*/
INCREMENTAL("增量"),
/**
* 指定范围
*/
SPECIFIED_RANGE("指定范围"),
;
private final String name;
TYPE(String name) {
this.name = name;
}
}
}
AST解析代码(未改进)
ASTParser parser = ASTParser.newParser(AST.JLS8);
Map<String, String> options = JavaCore.getOptions(); // 加上options 可以解决enum等生成树解析出错的问题
parser.setSource(javaSource.toCharArray());
CompilationUnit cu = (CompilationUnit) parser.createAST(null);
解析后的错误cu数据,可以看到FULL_AMOUNT变成一个void方法
import lombok.Getter;
@Getter public class DicTaskEnum {
/**
* 状态
*/
@Getter public enum STATUS;
{
}
private final Integer code;
private final String name;
void STATUS( Integer code, String name){
this.code=code;
this.name=name;
}
public static String getNameByCode( Integer code){
for ( STATUS typeEnum : STATUS.values()) {
if (typeEnum.getCode().equals(code)) {
return typeEnum.getName();
}
}
return null;
}
/**
* 状态
*/
@Getter public enum TYPE;
/**
* 全量
*/
void FULL_AMOUNT(){
}
private final String name;
void TYPE( String name){
this.name=name;
}
}
AST解析代码(改进后,多了options)
ASTParser parser = ASTParser.newParser(AST.JLS8);
Map<String, String> options = JavaCore.getOptions(); // 解析的时候加上java1.8的特性options
options.put(JavaCore.COMPILER_SOURCE, JavaCore.VERSION_1_8);
parser.setCompilerOptions(options);
parser.setKind(ASTParser.K_COMPILATION_UNIT); // 申明传入的是java文件
parser.setSource(javaSource.toCharArray());
CompilationUnit cu = (CompilationUnit) parser.createAST(null);
解析后的cu数据,这个结果就是正确的。方法、行范围都是准确的
STATUS
TYPE
getNameByCode
import lombok.Getter;
@Getter public class DicTaskEnum {
/**
* 状态
*/
@Getter public enum STATUS { /**
* 未执行
*/
NO_EXECUTION(1,"未执行"), /**
* 执行中
*/
EXECUTING(0,"执行中"); private final Integer code;
private final String name;
STATUS( Integer code, String name){
this.code=code;
this.name=name;
}
public static String getNameByCode( Integer code){
for ( STATUS typeEnum : STATUS.values()) {
if (typeEnum.getCode().equals(code)) {
return typeEnum.getName();
}
}
return null;
}
}
/**
* 状态
*/
@Getter public enum TYPE { /**
* 全量
*/
FULL_AMOUNT("全量"), /**
* 增量
*/
INCREMENTAL("增量"), /**
* 指定范围
*/
SPECIFIED_RANGE("指定范围"); private final String name;
TYPE( String name){
this.name=name;
}
}
}
边栏推荐
- Static variables in static function
- Special topic of binary tree -- acwing 1497 Traversal of the tree (use post and mid order traversal to build a binary tree)
- Array splitting (regular thinking
- STM32单片机编程学习
- 二叉树专题--洛谷 P1229 遍历问题(乘法原理 已知前、后序遍历求中序遍历个数)
- TIPC addressing 2
- static 函数中的静态变量
- 洛谷 P1892 [BOI2003]团伙(并查集变种 反集)
- MTK full dump抓取
- [play with FPGA learning 4 in simple terms ----- talk about state machine design]
猜你喜欢
Mongodb learning and sorting (condition operator, $type operator, limit() method, skip() method and sort() method)
二叉树专题--AcWing 1497. 树的遍历(利用后、中序遍历,构建二叉树)
PHP tea sales and shopping online store
The most detailed MySQL installation tutorial
Why does LabVIEW lose precision in floating point numbers
V2X-Sim数据集(上海交大&纽约大学)
二叉树专题--洛谷 P3884 [JLOI2009]二叉树问题(dfs求二叉树深度 bfs求二叉树宽度 dijkstra求最短路)
I STM32 development environment, keil5/mdk5.14 installation tutorial (with download link)
[in simple terms, play with FPGA learning 3 ----- basic grammar]
Uncover the secrets of Huawei application market application statistics
随机推荐
Static variables in static function
flink二開,實現了個 batch lookup join(附源碼)
二叉树专题--AcWing 47. 二叉树中和为某一值的路径(前序遍历)
TIPC介绍1
spritejs
spritejs
【深入浅出玩转FPGA学习4----漫谈状态机设计】
Complement (Mathematical Simulation
Implementation of six singleton modes
ros gazebo相关包的安装
static 函数中的静态变量
[AI application] Hikvision ivms-4200 software installation
[ark UI] implementation of the startup page of harmonios ETS
Is bond fund safe? Does the bond buying foundation lose principal?
TIPC Getting Started6
PCL projection point cloud
String (Analog
[quick application] there are many words in the text component. How to solve the problem that the div style next to it will be stretched
ImportError: cannot import name ‘Digraph‘ from ‘graphviz‘
webauthn——官方开发文档