当前位置:网站首页>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;
}
}
}
边栏推荐
- php中self和static在方法中的区别
- How to implement tabbar title bar with list component
- OpenMLDB Meetup No.4 会议纪要
- PHP tea sales and shopping online store
- Huawei game failed to initialize init with error code 907135000
- 金山云——2023届暑期实习
- TIPC protocol
- Array splitting (regular thinking
- Special topic of binary tree -- [deep base 16. Example 7] ordinary binary tree (simplified version) (multiset seeks the precursor and subsequent sentry Art)
- Special topic of binary tree -- Logu p1229 traversal problem (the number of traversals in the middle order is calculated when the pre and post order traversals of the multiplication principle are know
猜你喜欢
Importerror: impossible d'importer le nom « graph» de « graphviz»
Tick Data and Resampling
Flick two open, realized a batch lookup join (with source code)
TIPC Service and Topology Tracking4
一招快速实现自定义快应用titlebar
TIPC 寻址2
[play with FPGA learning 2 in simple terms ----- design skills (basic grammar)]
Implement custom drawer component in quick application
Overview of integrated learning
OpenMLDB Meetup No.4 会议纪要
随机推荐
二叉树专题--AcWing 3540. 二叉搜索树建树(实用板子 构建二叉搜索树 并输出前、中、后序遍历)
webauthn——官方开发文档
Resources读取2d纹理 转换为png格式
php中self和static在方法中的区别
ctf 记录
Special topic of binary tree -- acwing 3384 Binary tree traversal (known preorder traversal, while building a tree, while outputting middle order traversal)
二叉树专题--AcWing 18. 重建二叉树(利用前、中序遍历,构建二叉树)
Leetcode 182 Find duplicate email (2022.07.01)
Implement custom drawer component in quick application
【IDEA】使用插件一键逆向生成代码
二.Stm32f407芯片GPIO编程,寄存器操作,库函数操作和位段操作
Matlab processing of distance measurement of experimental electron microscope
Nodejs+express+mysql simple blog building
Tick Data and Resampling
Filtering of PCL
实验电镜距离测量之Matlab处理
Importerror: impossible d'importer le nom « graph» de « graphviz»
Regular and common formulas
Calculate the sum of sequences
Use Huawei performance management service to configure the sampling rate on demand