当前位置:网站首页>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;
}
}
}
边栏推荐
- js中给数组添加元素的方法有哪些
- Special topic of binary tree -- [deep base 16. Example 7] ordinary binary tree (simplified version) (multiset seeks the precursor and subsequent sentry Art)
- 【ARK UI】HarmonyOS ETS的启动页的实现
- spritejs
- 从攻击面视角,看信创零信任方案实践
- Nodejs+express+mysql simple blog building
- 最详细MySql安装教程
- Regular and common formulas
- TIPC introduction 1
- [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
猜你喜欢

华为应用市场应用统计数据问题大揭秘

【深入浅出玩转FPGA学习3-----基本语法】

flink二开,实现了个 batch lookup join(附源码)

Special topic of binary tree -- acwing 1589 Building binary search tree

TIPC Service and Topology Tracking4

Common methods of JS array

What are the software product management systems? Inventory of 12 best product management tools

From the perspective of attack surface, see the practice of zero trust scheme of Xinchuang
![Binary tree topic -- Luogu p3884 [jloi2009] binary tree problem (DFS for binary tree depth BFS for binary tree width Dijkstra for shortest path)](/img/c2/bb85b681af0f78b380b1d179c7ea49.png)
Binary tree topic -- Luogu p3884 [jloi2009] binary tree problem (DFS for binary tree depth BFS for binary tree width Dijkstra for shortest path)

金山云——2023届暑期实习
随机推荐
二叉树专题--P1030 [NOIP2001 普及组] 求先序排列
TIPC messaging3
通过券商经理的开户二维码开股票账户安全吗?还是去证券公司开户安全?
Supermarket (heap overload
每月1号开始计算当月工作日
Static variables in static function
MTK full dump抓取
Regular and common formulas
Verilog 和VHDL有符号数和无符号数相关运算
How to implement tabbar title bar with list component
力扣(LeetCode)182. 查找重复的电子邮箱(2022.07.01)
Logu p3398 hamster looks for sugar (double LCA on the tree to judge whether the two paths in the tree intersect)
PCL point cloud to depth image
【IDEA】使用插件一键逆向生成代码
华为快应用中如何实现同时传递事件对象和自定义参数
洛谷 P1892 [BOI2003]团伙(并查集变种 反集)
Mongodb learning and sorting (condition operator, $type operator, limit() method, skip() method and sort() method)
如何用list组件实现tabbar标题栏
Thanos Receiver
How to transfer event objects and user-defined parameters simultaneously in Huawei express applications