JAVA生成UML图片

根据设置的项路径生成所有controller的UML图片,扫描包含@RestController的代码(可根据需要自行修改)

package io.renren.common.utils;

import java.io.IOException;
import java.io.PrintWriter;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class ControllerDiagramGenerator {
    private static final String SRC_DIR = "F:\\workSpace\\projectName"; // 根据你的项目路径修改
    private static final String OUTPUT_FILE = "controller_diagram.puml";

    public static void main(String[] args) throws IOException {
        List<ClassInfo> controllerClasses = new ArrayList<>();

        Files.walk(Paths.get(SRC_DIR))
                .filter(path -> path.toString().endsWith(".java"))
                .filter(path -> !path.toString().endsWith("ControllerDiagramGenerator.java")) // ✅ 排除自身
                .forEach(path -> {
                    try {
                        String content = new String(Files.readAllBytes(path), StandardCharsets.UTF_8);
                        if (content.contains("@RestController")) {
                            ClassInfo info = extractClassInfo(content);
                            if (info != null) {
                                controllerClasses.add(info);
                            }
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                });

        generatePlantUML(controllerClasses);
        System.out.println("✅ UML 带方法信息生成成功,输出文件: " + OUTPUT_FILE);
    }

    static class ClassInfo {
        String className;
        String packageName;
        List<String> methods = new ArrayList<>();

        public ClassInfo(String className, String packageName) {
            this.className = className;
            this.packageName = packageName;
        }
    }

    private static ClassInfo extractClassInfo(String content) {
        Pattern pkgPattern = Pattern.compile("package\\s+([\\w\\.]+);");
        Pattern classPattern = Pattern.compile("public\\s+(?:abstract\\s+)?class\\s+(\\w+)");
        Pattern methodPattern = Pattern.compile("public\\s+[\\w<>,\\s\\[\\]]+\\s+(\\w+)\\s*\\([^\\)]*\\)\\s*\\{?");

        Matcher pkgMatcher = pkgPattern.matcher(content);
        Matcher clsMatcher = classPattern.matcher(content);
        Matcher methodMatcher = methodPattern.matcher(content);

        String pkg = pkgMatcher.find() ? pkgMatcher.group(1) : "(default)";
        String cls = null;
        if (clsMatcher.find()) {
            cls = clsMatcher.group(1);
        }

        if (cls == null) return null;

        ClassInfo info = new ClassInfo(cls, pkg);

        while (methodMatcher.find()) {
            String methodName = methodMatcher.group(1);
            if (!methodName.equals(cls)) { // 排除构造方法
                info.methods.add(methodName + "()");
            }
        }

        return info;
    }

    private static void generatePlantUML(List<ClassInfo> classes) throws IOException {
        try (PrintWriter writer = new PrintWriter(OUTPUT_FILE)) {
            writer.println("@startuml");
            writer.println("skinparam packageStyle rectangle");

            for (ClassInfo cls : classes) {
                writer.printf("class %s {\n", cls.className);
                for (String method : cls.methods) {
                    writer.printf("  + %s\n", method);
                }
                writer.println("}");
            }

            writer.println("@enduml");
        }
    }
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值