【Java】源码文件开头添加注释

需求

应公司质量部要求,需要对代码做静态检查。质量部要求,源码文件必须在起始行起设置一些注释,然而项目已经开发了一年之久,且没有维护这个注释。

此时,面对好几千个源码文件,我们如何快速添加相应的注释呢?

对,自己写一个程序来实现。

分析

假设注释模板为

/*
 * Model: <模块>
 * Description:  <描述> 
 * Author: <作者>
 * Finished: <时间>
 */

只要获得 <模块><描述><作者><时间> 的值,既可以通过文档读写完成给源码添加注释的需求。

代码

根据分析,实现代码如下:

package com.xzbd.jrx;

import java.io.*;
import java.nio.charset.Charset;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.List;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.RuntimeUtil;
import cn.hutool.core.util.StrUtil;

public class AddFileHeaderComment {

    private static String projectPath = "D:\\workspace\\builder_backend";

    public static void main(String[] args) {

        addFileHeaderComments(projectPath);
    }

    public static void addFileHeaderComments(String projectPath) {
        try {
            Files.walkFileTree(Paths.get(projectPath), new SimpleFileVisitor<Path>() {
                @Override
                public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
                    String filePath = file.toString();

                    // 仅对Java文件进行
                    if (filePath.endsWith(".java")) {
                        addCommentToFile(file.toFile());
                    }
                    return FileVisitResult.CONTINUE;
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void addCommentToFile(File file) {
        try {
            String packageName = getPackageName(file);
            String className = getClassName(file);
            String author = getAuthor(file);
            String date = getFileModifiedDate(file);

            String comment = String.format("/*%n" +
                    " * Model: %s%n" +
                    " * Description: %s%n" +
                    " * Author: %s%n" +
                    " * Finished: %s%n" +
                    " */%n%n", packageName, className, author, date);

            String originalContent = Files.readString(file.toPath());
            String newContent = comment + originalContent;

            Files.write(file.toPath(), newContent.getBytes("utf-8"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static String getPackageName(File file) throws IOException {
        String absolutePath = file.getAbsolutePath();
        String sep = "com\\xzbd\\";
        String packageName = StrUtil.subAfter(absolutePath, sep, false);
        packageName = StrUtil.subBefore(packageName, File.separator, false);
        
        // 可以使用 file.getParent().getFileName(); 根据需要调整
        return packageName;
    }

    public static String getClassName(File file) {

        return file.getName().replaceFirst("[.][^.]+$", "");
    }

    public static String getAuthor(File file) {
        String absolutePath = file.getAbsolutePath();
        String cmd = String.format("git --git-dir=%s\\.git --work-tree=%s log --reverse %s", projectPath, projectPath,
                absolutePath);
        List<String> execForLines = RuntimeUtil.execForLines(Charset.forName("utf-8"), cmd);

        for (String line : execForLines) {
            String sep = "Author:";
            if (StrUtil.startWith(line, sep)) {
                String useranme = StrUtil.subAfter(line, sep, false);
                return useranme;
            }
        }
        return "<Your Name>";
    }

    public static String getFileModifiedDate(File file) {
        String absolutePath = file.getAbsolutePath();
        String cmd = String.format("git --git-dir=%s\\.git --work-tree=%s log --reverse %s", projectPath, projectPath,
                absolutePath);
        List<String> execForLines = RuntimeUtil.execForLines(Charset.forName("utf-8"), cmd);

        for (String line : execForLines) {
            String sep = "Date:";
            if (StrUtil.startWith(line, sep)) {
                String dateStr = StrUtil.subAfter(line, sep, false);
                Date data = new Date(dateStr);
                DateTimeFormatter dateFmt = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
                String date = DateUtil.format(data, dateFmt);
                return date;
            }
        }
        DateTimeFormatter dateFmt = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
        String date = DateUtil.format(new Date(), dateFmt);
        return date;
    }
}


执行后的效果
在这里插入图片描述

总结

文中代码程序实现了对java文件添加注释的功能,其中用到了 hutool-all 工具,其 pom 如下:

		<dependency>
			<groupId>cn.hutool</groupId>
			<artifactId>hutool-all</artifactId>
			<version>5.8.16</version>
		</dependency>

另外,程序也使用了 git log 查看文件的日志信息,以获取文件正确的作者,和完成时间。该 git 命令详解,参考文章【Git】任何位置查看git日志

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/326603.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

滑块拖动验证

效果 代码 svg图标 初始图标 <svg t"1705397535958" class"icon" viewBox"0 0 1024 1024" version"1.1" xmlns"http://www.w3.org/2000/svg" p-id"1492" width"200" height"200">&l…

Kubernetes核心实战

kubernetes&#xff08;一&#xff09;概述与架构 kubernetes&#xff08;二&#xff09;创建集群 云原生实战 语雀 官网 Kubernetes 文档 | Kubernetes B站课程&#xff1a;https://www.bilibili.com/video/BV13Q4y1C7hS/?p41 1.Namespace 名称空间&#xff0c;用来对集群…

【书生·浦语】大模型实战营——LMDeploy 大模型量化部署实战

大模型部署背景 大模型部署是指将训练好的模型在特定的软硬件环境中启动的过程&#xff0c;使模型能够接收输入并返回预测结果。大模型的内存开销巨大&#xff0c;7B模型仅权重需要14G内存。另外大模型是自回归生成&#xff0c;需要缓存Attention的 k/v。 LMDeploy 简介 推理性…

SpringMVC请求源码分析

文章目录 一、SpringMVC简介1. 概念2. 从Servlet到SprigMVC3. SpringMVC的XML实现4. SpringMVC的请求流程 二、SpringMVC源码分析1. SpringMVC启动流程验证2. 细节补充 一、SpringMVC简介 1. 概念 官网介绍 Spring Web MVC is the original web framework built on the Servl…

【Leetcode】82. 删除排序链表中的重复元素 II

文章目录 题目思路代码 题目 82. 删除排序链表中的重复元素 II 题目&#xff1a;给定一个已排序的链表的头 head &#xff0c; 删除原始链表中所有重复数字的节点&#xff0c;只留下不同的数字 。返回 已排序的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,3,4,…

uni-app的项目创建和环境搭建

uni-app 是一个使用 Vue.js 开发所有前端应用的框架&#xff0c;开发者编写一套代码&#xff0c;可发布到iOS、Android、Web&#xff08;响应式&#xff09;、以及各种小程序&#xff08;微信/支付宝/百度/头条/飞书/QQ/快手/钉钉/淘宝&#xff09;、快应用等多个平台。 第一步…

Linux的权限(1)

目录 操作系统的"外壳"程序 外壳程序是什么&#xff1f; 为什么存在外壳程序&#xff1f; 外壳程序怎么运行操作&#xff1f; 权限 什么是权限&#xff1f; 权限的本质&#xff1f; Linux中的&#xff08;人&#xff09;用户权限&#xff1f; su和su -的区别…

C for Graphic:Sliced Circle Image

不做UI不知道&#xff0c;没想到时至今日&#xff0c;ugui居然没有sliced filled image模式&#xff0c;用circle做filled&#xff0c;不能用sliced九宫格图&#xff0c;导致每次使用这个效果必须一张新图&#xff0c;何其浪费资源。 原始功能如下&#xff1a; 我…

Python数据分析案例34——IMDB电影评论情感分析(Transformer)

电影评论的情感分析 案例背景 很多同学对电影系列的数据都比较喜欢&#xff0c;那我就补充一下这个最经典的文本分类数据集&#xff0c;电影情感评论分析。用神经网络做。对国外的英文评论文本进行分类&#xff0c;看是正面还是负面情感。 数据集介绍 数据集&#xff1a;IMDb…

PY32C613单片机简单介绍,高性能 32 位 ARM M0+内核,主频最高48M

PY32C613单片机是普冉新推出的高性能的 32 位 ARM Cortex-M0 内核&#xff0c;宽电压工作范围的 MCU。价格在市场上非常有竞争性&#xff0c;外设非常的丰富。PY32C613嵌入高达 64 Kbytes flash 和 8 Kbytes SRAM 存储器&#xff0c;最高工作频率 48 MHz&#xff0c;QFN20封装。…

uniapp 图片保持宽高比,撑满屏幕宽度

image 标签添加 mode"widthFix" <image mode"widthFix" :src"detailData.coverImageURL" />image 标签添加样式 image {width: 100%;height: auto; }

x-cmd pkg | sd - sed 命令的现代化替代品

目录 简介首次用户快速上手主要特点进一步阅读 简介 sd 是一个基于正则表达式的搜索和替换文本的命令行工具&#xff0c;类似于 sed&#xff0c;但 sd 使用更简单&#xff0c;对用户更为友好。 首次用户快速上手 使用 x sd 即可自动下载并使用 在终端运行 eval "$(curl …

【分布式技术】分布式存储ceph部署

目录 一、存储的介绍 单机存储设备 单机存储的问题 商业存储 分布式存储 二、分布式存储 什么是分布式存储 分布式存储的类型 三、ceph简介 四、ceph的优点 五、ceph的架构 六、ceph的核心组件 七、OSD存储后端 八、Ceph 数据的存储过程 九、Ceph 版本发行生命周…

单片机和Linux嵌入式区别

1.单片机 单片机是一种集成电路&#xff0c;它能够在一个芯片上完成各种计算、控制和管理任务。单片机没有明确的分层&#xff0c;这是因为它通常被用来设计嵌入式系统&#xff0c;其程序结构和功能要根据具体的应用需求来设计。 在单片机的程序设计中&#xff0c;可以通过一…

SQL Server Management Studio (SSMS) 备份数据库

文章目录 前言一、在界面上操作二、使用sql 代码操作总结 前言 之前的文章记录过如何使用sqlserver复制远程数据库到本地。这里补充下如何使用SQL Server Management Studio (SSMS) 备份。 传送门&#xff1a;sqlserver复制远程数据库到本地 一、在界面上操作 在 SQL Server …

AP上线配置流程

AP工作模式 相应地&#xff0c;AR路由器的WLAN工作模式分为FAT AP和AC两种模式&#xff0c;不同的模式对应不同的使用场景。 FAT AP模式&#xff1a;AR路由器作为FAT AP&#xff0c;独立为用户提供WLAN接入服务&#xff0c;无线网络的配置在FAT AP上单独配置。FAT AP模式主要…

链上繁荣,合作不断,外媒热议波场 TRON 2023 年度成绩

近日&#xff0c;权威外媒Theblock、美联社和Decrypt等就波场 TRON 2023大事件进行了年度盘点。报道指出&#xff0c;波场TRON网络在2023年取得了一系列的发展和合作&#xff0c;提升了其在Web3领域的地位。其中&#xff0c;波场TRON网络账户数量增加了 54&#xff05;&#xf…

微信视频号提取视频工具和提取器有什么不同?怎么下载和使用!

微信视频号怎么提取视频和视频号提取器有啥区别&#xff1f;这个是最近问我特别多的小伙伴&#xff0c;今天就和大家讲讲两者有什么不同怎么使用&#xff01; 视频号视频提取工具和提取器在早期区分的是网页工具和电脑上软件使用的一种方式&#xff0c;用户通过这些方式解决自…

深度系统QT 环境搭建

1.QT安装 不折腾最新版直接去商店搜索QT安装。 2.修改su密码&#xff0c;安装需要权限 打开一个终端&#xff0c;然后输入下面的命令&#xff1a;按照提示输入密码按回车就行。 sudo passwd 回车后会出现让你输入现在这个账户的密码&#xff1a; 3.编译环境安装。 安…

DHCP详解(配置小实验)

目录 一、DHCP 1、了解DHCP 2、使用DHCP的好处 3、HDCP的分配方式 4、DHCP协议中的报文 5、DHCP的租约过程 6、安装和配置DHCP服务 一、DHCP 1、了解DHCP DHCP(Dynamic Host Configuration Protocol&#xff0c;动态主机配置协议)由Internet工作任务小组设计开发专门用…