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