【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 "";
    }

    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】源码文件开头添加注释_第1张图片

总结

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

		<dependency>
			<groupId>cn.hutoolgroupId>
			<artifactId>hutool-allartifactId>
			<version>5.8.16version>
		dependency>

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

你可能感兴趣的:(总结,java)