需求
应公司质量部要求,需要对代码做静态检查。质量部要求,源码文件必须在起始行起设置一些注释,然而项目已经开发了一年之久,且没有维护这个注释。
此时,面对好几千个源码文件,我们如何快速添加相应的注释呢?
对,自己写一个程序来实现。
分析
假设注释模板为
/** 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>() {@Overridepublic 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日志