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, 二进制发布, 云安全监控, 云资产清单, 代码分析, 代码生成, 凭证管理, 反编译, 域名枚举, 开发辅助工具, 开源工具, 渗透测试工具, 类关系分析, 类加载器, 软件可视化, 逆向工程, 静态分析