JAVA
[JAVA] 작성된 Class 정보 추출하기(엑셀 출력 추가)
최강깜시
2025. 5. 16. 17:50
Gradle에 추가
implementation 'com.github.javaparser:javaparser-core:3.25.7'
implementation 'org.apache.poi:poi:5.2.5'
implementation 'org.apache.poi:poi-ooxml:5.2.5'
ClassDocExtractor.java
package com.company;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import com.github.javaparser.StaticJavaParser;
import com.github.javaparser.ast.CompilationUnit;
import com.github.javaparser.ast.Modifier;
import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
public class ClassDocExtractor {
// 📊 Excel로 출력할 데이터 저장 리스트 (헤더 포함)
private static final List<List<String>> excelData = new ArrayList<>();
public static void main(String[] args) throws Exception {
// Java 소스 파일 경로 (예시)
File rootDir = new File("프로젝트경로/src/main/java");
if (!rootDir.exists() || !rootDir.isDirectory()) {
System.err.println("루트 디렉토리 경로가 잘못되었어요: " + rootDir.getAbsolutePath());
return;
}
// 📋 엑셀 헤더 추가
excelData.add(Arrays.asList("파일", "클래스명", "클래스 주석", "종류", "이름", "타입/반환타입", "접근제어자/파라미터", "주석"));
// 🚀 재귀 탐색 시작
scanDirectory(rootDir);
// 📥 Excel로 저장
ExcelWriter.writeToExcel(excelData, "class_doc_output.xlsx");
System.out.println("✅ Excel 저장 완료: class_doc_output.xlsx");
}
private static void scanDirectory(File dir) {
File[] files = dir.listFiles();
if (files == null) return;
for (File file : files) {
if (file.isDirectory()) {
scanDirectory(file); // 재귀적으로 디렉토리 탐색
} else if (file.getName().endsWith(".java")) {
parseJavaFile(file);
}
}
}
// 📄 Java 파일 파싱 및 클래스 정보 출력
private static void parseJavaFile(File file) {
try {
CompilationUnit cu = StaticJavaParser.parse(file);
cu.findAll(ClassOrInterfaceDeclaration.class).forEach(clazz -> {
String className = clazz.getNameAsString();
Optional<String> classComment = clazz.getComment().map(c -> c.getContent().trim());
System.out.println("📂 파일: " + file.getPath());
System.out.println("🧩 클래스명: " + className);
System.out.println("📝 클래스 주석: " + classComment.orElse("(없음)"));
// 📌 필드 정보
clazz.getFields().forEach(field -> {
String fieldType = field.getElementType().asString();
field.getVariables().forEach(var -> {
String fieldName = var.getNameAsString();
Optional<String> fieldComment = field.getComment().map(c -> c.getContent().trim());
String modifiers = field.getModifiers().stream()
.map(Modifier::toString)
.reduce("", String::concat).trim();
System.out.println();
System.out.println(" 📌 속성: " + fieldName);
System.out.println(" 📎 타입: " + fieldType);
System.out.println(" 🛡️ 접근제어자: " + modifiers);
System.out.println(" 🗒️ 주석: " + fieldComment.orElse("(없음)"));
System.out.println(" ------------------------------");
// Excel 행 추가
excelData.add(Arrays.asList(
file.getPath(),
className,
classComment.orElse(""),
"필드",
fieldName,
fieldType,
"",
fieldComment.orElse("")
));
});
});
// 🔍 메서드 정보 추출
clazz.getMethods().forEach(method -> {
String methodName = method.getNameAsString();
String returnType = method.getType().asString();
String parameters = method.getParameters().toString(); // List 형태
Optional<String> methodComment = method.getComment().map(c -> c.getContent().trim());
System.out.println();
System.out.println(" 🔧 메서드: " + methodName);
System.out.println(" 🎯 반환타입: " + returnType);
System.out.println(" 📦 파라미터: " + parameters);
System.out.println(" 🗒️ 메서드 주석");
System.out.println(" " + methodComment.orElse("(없음)"));
System.out.println(" ------------------------------");
// Excel 행 추가
excelData.add(Arrays.asList(
file.getPath(),
className,
classComment.orElse(""),
"메서드",
methodName,
returnType,
parameters,
methodComment.orElse("")
));
});
System.out.println("======================================");
});
} catch (Exception e) {
System.err.println("❌ 파싱 실패: " + file.getPath());
e.printStackTrace();
}
}
}
ExcelWriter.java
package com.company;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileOutputStream;
import java.util.List;
public class ExcelWriter {
public static void writeToExcel(List<List<String>> rows, String filePath) throws Exception {
Workbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet("Class Documentation");
// 스타일 지정 (선택사항)
CellStyle headerStyle = workbook.createCellStyle();
Font font = workbook.createFont();
font.setBold(true);
headerStyle.setFont(font);
for (int i = 0; i < rows.size(); i++) {
Row row = sheet.createRow(i);
List<String> columns = rows.get(i);
for (int j = 0; j < columns.size(); j++) {
Cell cell = row.createCell(j);
cell.setCellValue(columns.get(j));
if (i == 0) cell.setCellStyle(headerStyle); // 첫 줄은 헤더
}
}
// 자동 너비 조정
for (int i = 0; i < rows.get(0).size(); i++) {
sheet.autoSizeColumn(i);
}
try (FileOutputStream out = new FileOutputStream(filePath)) {
workbook.write(out);
}
workbook.close();
}
}
클래스 정보를 모두 추출한다. 주석까지...