根据设置的项路径生成所有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");
}
}
}
2万+

被折叠的 条评论
为什么被折叠?



