Java实体类注释处理-笔记

背景

在java实体bean处理的过程中,需要将实体类的属性与注释向对应起来。

/**
 * userId编号
 */
private Integer userId;
//用户姓名
private String userName;
//密码
private String password;
/*
 * 用户电话
 */
private String phone;

上面的java实体类的代码希望转换成,map的对应形式。

map.put("userId", "userId编号");
map.put("userName", "用户姓名");
map.put("password", "密码");
map.put("phone", "用户电话");
解决思路
处理注释

由于代码文件是按行读取,每行line.contains("*")为true就认为这是一个多行注释,放入StringBuilder中;
提取多行注释的文字,需要用到正则 \/\*+(.*)\*\/

单行注释如果line.contains("//")就认为是一个单行注释。提取单行注释很容易,直接replace掉//就可以了。

处理实体类的属性

正则匹配实体类的属性正则 private\s[A-Za-z].*\s([A-Za-z0-9]+)\;

处理规则

仿照中缀表达式的思想,注释内容和实体类属性是成对出现,而且配对不能错乱。
当某个实体类的属性没有注释时就不处理这个实体类。
解决方式,首先处理提取注释后,进行压栈。
随后处理实体类的属性,紧接着栈顶出栈就是当前这个实体类属性的注释。

定义正则

private static final Pattern PROGRAM_REG = Pattern.compile("private\\s[A-Za-z].*\\s([A-Za-z0-9]+)\\;");
private static final Pattern COMMENT_REG = Pattern.compile("\\/\\*+(.*)\\*\\/");
private static final Pattern CLASS_REG = Pattern.compile("\\sclass\\s");

存放注释的栈

private Queue<String> pragramQueue = new LinkedList<>();

根据路径加载文件流

InputStream inputStream = new FileInputStream(path);
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));

按行读取文件

String line=null;
while ((line = reader.readLine()) != null) {
	
}

不处理class类之前的注释

boolean startBool = false;
Matcher clazzMather = CLASS_REG.matcher(line);
if (clazzMather.find()) {
    startBool = true;
}
if (!startBool) {
    continue;
}

处理多行注释

if (line.contains("*")) {
    moreComment.append(line);
}
if (line.contains("*/")) {
    String programComment = moreComment.toString().replaceAll("\\s", "");

    Matcher commentMatcher = COMMENT_REG.matcher(programComment);
    if (commentMatcher.find()) {
        programComment = commentMatcher.group(1);
    }

    //入栈
    pragramQueue.add(programComment);
    moreComment.delete(0, moreComment.length());
    continue;
}

处理单行注释

if (line.contains("//")) {
    moreComment.append(line);
    pragramQueue.add(moreComment.toString().replace("//", ""));
    moreComment.delete(0, moreComment.length());
    continue;
}

提取注释与实体类属性集合打印输出

//处理属性与注释结合
Matcher programMatcher = PROGRAM_REG.matcher(line);
if (programMatcher.find()) {
    //出栈
    String comment = pragramQueue.poll();
    if (StringUtils.isBlank(comment)) {
        continue;
    }
    comment = comment.trim();

    String cleanField = programMatcher.group(1);
    //打印结果
    System.out.println("map.put(\"" + cleanField + "\", \"" + comment + "\");");
}

点击获取完整代码

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值