paulhondola/archlens

GitHub: paulhondola/archlens

一款基于 Python 的 Java 字节码与未来 C# 反向工程工具,自动生成 UML 类图以辅助代码理解与文档生成。

Stars: 0 | Forks: 0

# ArchLens 一个包含 **Python CLI** 的单体仓库,用于从编译后的二进制文件生成 UML 类图。传入 `.jar`(Java)或 `.dll`(C#)文件,即可获得 PlantUML 或 yUML 输出。 | 语言 | 输入 | 状态 | | ------ | ------ | ---------- | | Java | `.jar` | 已实现 | | C# | `.dll` | 即将推出 | ## 仓库结构 ``` . ├── pyproject.toml # Python project root (uv + setuptools) ├── archlens/ # Python orchestrator package │ ├── cli.py # Entry point: decompile command │ ├── router.py # Routes .jar → Java adapter, .dll → C# adapter │ ├── config.py # DecompileConfig dataclass │ ├── build.py # Entry points: build-java, build-csharp, build-all │ └── adapters/ │ ├── java_adapter.py # Invokes the Java fat JAR via subprocess │ └── csharp_adapter.py # Stub — raises NotImplementedError ├── tests/ # Python test suite (pytest) ├── java/ # Java decompiler (Maven + picocli) │ ├── pom.xml │ └── src/ └── csharp/ # C# decompiler stub (dotnet classlib) └── CSharpDecompiler/ ``` ## 快速开始 需要 Python 3.11+、Java 25+、Maven 以及 [uv](https://docs.astral.sh/uv/)。 ``` # 安装 Python 依赖项 uv sync # 构建 Java fat JAR uv run build-java # 运行 uv run decompile MyLib.jar --format plantuml ``` ## Python CLI ``` Usage: decompile [-h] --format {plantuml,yuml} [--ignore PATTERN] [--output FILE] [--yuml-mode {SIMPLE,CLASSES}] FILE FILE .jar or .dll file to analyse --format Output format: plantuml, yuml [required] --ignore PATTERN Class name pattern to exclude (repeatable) --output FILE Write output to FILE instead of stdout --yuml-mode MODE yUML rendering mode: SIMPLE, CLASSES [default: SIMPLE] ``` ### 示例 ``` # PlantUML 输出到标准输出 uv run decompile MyLib.jar --format plantuml # yUML 包含完整成员详细信息,写入文件 uv run decompile MyLib.jar --format yuml --yuml-mode CLASSES --output diagram.yuml # 忽略包 uv run decompile MyLib.jar --format plantuml \ --ignore "java.lang.*" --ignore "java.util.*" ``` ## 构建命令 ``` uv run build-java # mvn -f java/pom.xml package -DskipTests uv run build-csharp # dotnet build csharp/CSharpDecompiler uv run build-all # both in sequence, stops on first failure ``` ## Java 反编译器 ### 工作原理 Java 适配器将输入的 JAR 文件直接传递给胖 JAR CLI 工具,该工具运行一个分层的反射流水线: ``` JAR file │ ▼ JarLoader load Class objects via URLClassLoader │ ▼ ClassFilter apply --ignore patterns │ ▼ ClassInspector extract fields, methods, relationships via reflection │ ▼ UmlFormatter render to yUML or PlantUML string │ ▼ stdout / file ``` 关系完全通过反射发现: | 关系 | 来源 | | ---------- | --------------------------------------------- | | `extends` | `clazz.getSuperclass()` | | `implements` | `clazz.getInterfaces()` | | `association` | 字段类型(包括泛型类型参数) | | `dependency` | 方法参数和返回类型 | ### Java 包结构 ``` org.paul/ ├── Main.java # CLI entry point ├── config/ │ └── DecompileConfig.java # Immutable config record ├── loader/ │ └── JarLoader.java # Opens JAR, loads classes via URLClassLoader ├── model/ │ ├── ClassInfo.java # Immutable snapshot of a single class │ ├── Relationship.java # Sealed type: Extends | Implements | Association | Dependency │ └── FieldInfo.java # Field name, type string, access modifier char ├── introspection/ │ └── ClassInspector.java # Extracts ClassInfo from a Class via reflection ├── filter/ │ └── ClassFilter.java # Applies ignore patterns before introspection └── formatter/ ├── UmlFormatter.java # Interface: format(List, config) → String ├── YumlFormatter.java # yUML output (SIMPLE / CLASSES modes) └── PlantUmlFormatter.java # PlantUML output ``` ### 直接调用 Java CLI 胖 JAR 也可以独立使用: ``` java -jar java/target/Java-Decompiler-1.0-SNAPSHOT.jar MyLib.jar --format plantuml java -jar java/target/Java-Decompiler-1.0-SNAPSHOT.jar MyLib.jar \ --format yuml --yuml-mode CLASSES --output diagram.yuml java -jar java/target/Java-Decompiler-1.0-SNAPSHOT.jar MyLib.jar \ --format plantuml --ignore "java.lang.*,java.util.*" ``` ### Java 测试 ``` cd java && mvn test ``` 测试对每一层进行独立覆盖,并通过比对 fixture 文件验证端到端输出: | Fixture | 内容 | | ---------------- | ----------------------------------- | | `tempsensor/` | TempSensor.jar — yUML 与 PlantUML | | `eventnotifier/` | EventNotifier.jar — yUML 简单/类 | | `selftest/` | 工具自分析自身 | **自测**——重新生成自测 fixture: ``` java -jar java/target/Java-Decompiler-1.0-SNAPSHOT.jar \ java/target/Java-Decompiler-1.0-SNAPSHOT.jar \ --format plantuml \ --output "java/src/test/java/selftest/selftest.puml" \ --ignore "picocli.*" ``` ## 输出格式 ### PlantUML ``` @startuml interface InterfaceName{ method() } class ClassName{ -fieldName:FieldType methodName() } Parent <|--- Child Owner ---> Target @enduml ``` ### yUML — SIMPLE 模式 ``` [ClassName] [Interface]^-.-[Implementor] [Parent]^-[Child] [Owner]->[Target] ``` ### yUML — CLASSES 模式 访问修饰符符号: | Java 修饰符 | 符号 | | ------------- | ---- | | `private` | `-` | | `protected` | `#` | | `public` | `+` | | package-private | `~` | 参数化类型渲染为 `ArrayList of Observer`。 ## Python 测试 ``` uv run pytest -v ``` | 测试文件 | 覆盖范围 | | ------------------------ | -------------------------------------------------- | | `test_router.py` | 扩展路由、不区分大小写处理 | | `test_java_adapter.py` | PlantUML/yUML 输出、忽略模式、缺失 JAR | | `test_csharp_adapter.py` | 所有配置的 NotImplementedError |
标签:C#反编译, DLL分析, Java反编译, Java工具, Java适配器, JS文件枚举, Maven, .NET反编译, Picocli, PlantUML, Pyproject TOML, Python 3.11, Python CLI, SEO: Java逆向, SEO: PlantUML工具, SEO: UML生成, SEO: 类图生成器, UML生成, UV包管理, yUML, 二进制分析, 二进制发布, 云安全监控, 云安全运维, 云资产清单, 代码可视化, 依赖解析, 域名枚举, 多人体追踪, 子进程调用, 开源工具, 架构可视化, 测试套件, 漏洞验证, 类图生成, 自动化构建, 跨语言工具, 逆向工具, 逆向工程, 配置文件解析, 静态分析