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, 二进制分析, 二进制发布, 云安全监控, 云安全运维, 云资产清单, 代码可视化, 依赖解析, 域名枚举, 多人体追踪, 子进程调用, 开源工具, 架构可视化, 测试套件, 漏洞验证, 类图生成, 自动化构建, 跨语言工具, 逆向工具, 逆向工程, 配置文件解析, 静态分析