paulhondola/Java-Decompiler
GitHub: paulhondola/Java-Decompiler
通过Java反射检查已编译的JAR文件并生成UML类图的命令行工具,支持yUML和PlantUML输出格式。
Stars: 0 | Forks: 0
# Java 反编译器
一个使用 Java 反射来检查已编译的 `.jar` 文件并生成 UML 类图的命令行工具。支持 **yUML** 和 **PlantUML** 输出格式。
## 工作原理
工具运行严格的分层管道:
```
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` | 方法参数和返回类型 |
## 包结构
```
org.paul/
├── Main.java # CLI entry point — orchestrates the pipeline
├── 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> using reflect
├── 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 25+ 和 Maven。
```
mvn package
```
生成一个包含所有依赖项(包括 picocli)的独立 fat JAR,位于 `target/Java-Decompiler-1.0-SNAPSHOT.jar`。
要构建并跳过测试:
```
mvn package -DskipTests
```
## 用法
```
Usage: java-decompiler [-hV] --format= [--ignore=PATTERN[,PATTERN...]]
[--output=FILE] [--yuml-mode=MODE] JAR
JAR Path to the JAR file to analyse.
--format= Output format: yuml, plantuml.
--ignore=PATTERN Class name patterns to exclude, comma-separated or
repeated (e.g. 'java.lang.*').
--output=FILE Write output to FILE instead of stdout.
--yuml-mode=MODE yUML rendering mode (only with --format yuml):
SIMPLE, CLASSES. Default: SIMPLE.
-h, --help Show this help message and exit.
-V, --version Print version information and exit.
```
### 示例
```
# PlantUML 图表到 stdout
java -jar target/Java-Decompiler-1.0-SNAPSHOT.jar MyLib.jar --format plantuml
# 包含完整成员详情的 yUML,写入文件
java -jar target/Java-Decompiler-1.0-SNAPSHOT.jar MyLib.jar --format yuml --yuml-mode CLASSES --output diagram.yuml
# 忽略多个包
java -jar target/Java-Decompiler-1.0-SNAPSHOT.jar MyLib.jar --format plantuml \
--ignore "java.lang.*" --ignore "java.util.*"
# 使用逗号分隔形式的相同内容
java -jar target/Java-Decompiler-1.0-SNAPSHOT.jar MyLib.jar --format plantuml \
--ignore "java.lang.*,java.util.*"
```
## 输出格式
### yUML — SIMPLE 模式
每个类一行,每个关系一行。无成员详情。
```
[ClassName]
[Interface]^-.-[Implementor]
[Parent]^-[Child]
[Owner]->[Target]
```
### yUML — CLASSES 模式
相同的关系,但字段和方法嵌入在类节点中:
```
[ClassName|- field:Type|+ method()]
```
访问修饰符符号:
| Java 修饰符 | 符号 |
|----------------|--------|
| `private` | `-` |
| `protected` | `#` |
| `public` | `+` |
| package-private| `~` |
参数化类型渲染为 `ArrayList of Observer`。
### PlantUML
```
@startuml
interface InterfaceName{
method()
}
class ClassName{
-fieldName:FieldType
methodName()
}
Parent <|--- Child
Owner ---> Target
@enduml
```
## 运行测试
```
mvn test
```
测试独立覆盖每一层(单元),并针对 `src/test/java/` 中的 fixture 文件验证端到端输出:
| Fixture 目录 | 内容 |
|----------------------|---------------------------------------|
| `tempsensor/` | TempSensor.jar — yUML 和 PlantUML |
| `eventnotifier/` | EventNotifier.jar — yUML simple/classes |
| `selftest/` | 工具分析自身(见下文) |
## 自测
这三个命令对工具自身的 fat JAR 运行反编译器,并将结果写入 `selftest/` fixture 目录。通过 `--ignore` 排除 Picocli 内部组件。
```
java -jar target/Java-Decompiler-1.0-SNAPSHOT.jar target/Java-Decompiler-1.0-SNAPSHOT.jar \
--format plantuml \
--output "src/test/java/selftest/selftest.puml" \
--ignore "picocli.*"
java -jar target/Java-Decompiler-1.0-SNAPSHOT.jar target/Java-Decompiler-1.0-SNAPSHOT.jar \
--format yuml --yuml-mode SIMPLE \
--output "src/test/java/selftest/selftest-simple.yuml" \
--ignore "picocli.*"
java -jar target/Java-Decompiler-1.0-SNAPSHOT.jar target/Java-Decompiler-1.0-SNAPSHOT.jar \
--format yuml --yuml-mode CLASSES \
--output "src/test/java/selftest/selftest-classes.yuml" \
--ignore "picocli.*"
```
标签:Introspection, JAR文件处理, Java反射, Java开发工具, JS文件枚举, PlantUML, URLClassLoader, URL提取, yUML, 二进制发布, 云安全监控, 云资产清单, 代码分析, 代码生成, 凭证管理, 反编译, 域名枚举, 开发辅助工具, 开源工具, 渗透测试工具, 类关系分析, 类加载器, 软件可视化, 逆向工程, 静态分析