You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
3.7 KiB
3.7 KiB
Java Decompilers Reference
Recommended Decompilers
1. CFR (Class File Reader) - Recommended
Best for: Modern Java (Java 8+), lambda expressions, enums
- Download: https://github.com/leibnitz27/cfr/releases
- Version: 0.152
- Usage:
java -jar cfr.jar MyClass.class
Key features:
- Excellent Java 8+ support
- Handles modern language features
- Active development
- Command-line interface
2. Procyon
Best for: Complex generics, enum switch maps
- Download: https://github.com/mstrobel/procyon/releases
- Usage:
java -jar procyon-decompiler.jar MyClass.class
3. Fernflower
Best for: IntelliJ IDEA integration
- Built into: IntelliJ IDEA
- Standalone: https://github.com/fesh0r/fernflower
- Usage:
java -jar fernflower.jar MyClass.class output/
4. JD-GUI
Best for: Quick GUI browsing
- Download: http://java-decompiler.github.io/
- Features: Graphical interface, export source
- Usage: Open .class or .jar file in GUI
5. JADX
Best for: Android DEX/Android bytecode
- Download: https://github.com/skylot/jadx
- Features: GUI and CLI, Android support
Decompiler Comparison
| Feature | CFR | Procyon | Fernflower | JD-GUI |
|---|---|---|---|---|
| Java 8+ | ✅ | ✅ | ✅ | ⚠️ |
| Lambda | ✅ | ✅ | ✅ | ❌ |
| Enum | ✅ | ✅ | ✅ | ⚠️ |
| Generics | ✅ | ✅ | ✅ | ⚠️ |
| Speed | Fast | Medium | Fast | Fast |
| CLI | ✅ | ✅ | ✅ | ❌ |
| GUI | ❌ | ❌ | ❌ | ✅ |
CFR Usage Examples
Basic Decompilation
# Single file
java -jar cfr.jar MyClass.class
# Output to directory
java -jar cfr.jar MyClass.class --outputdir ./src
# Multiple files
java -jar cfr.jar *.class --outputdir ./src
Advanced Options
# Decode lambda expressions
java -jar cfr.jar MyClass.class --decodelambdas true
# Remove boilerplate
java -jar cfr.jar MyClass.class --removeboilerplate true
# Handle obfuscated code
java -jar cfr.jar MyClass.class --renamedupmembers true
# Add classpath for dependencies
java -jar cfr.jar MyClass.class --extraclasspath ./lib/*.jar
Batch Processing
# Decompile all classes in directory
find ./classes -name "*.class" -exec java -jar cfr.jar {} --outputdir ./src \;
# Using xargs for efficiency
find ./classes -name "*.class" | xargs -I {} java -jar cfr.jar {} --outputdir ./src
Troubleshooting
Common Errors
ClassFormatError
- Cause: Corrupted or invalid class file
- Solution: Verify file integrity, re-download if possible
UnsupportedClassVersionError
- Cause: Class compiled with newer Java version
- Solution: Use matching or newer Java version to decompile
NoClassDefFoundError
- Cause: Missing dependency classes
- Solution: Add dependencies to classpath with
--extraclasspath
OutOfMemoryError
- Cause: Large class file or complex code
- Solution: Increase heap size:
java -Xmx2g -jar cfr.jar ...
Performance Tips
- Batch processing: Use xargs or scripts for multiple files
- Memory: Set appropriate heap size for large projects
- Parallel: Process multiple files in parallel
- Filtering: Skip test classes if not needed
Post-Decompilation
After decompiling:
- Verify: Check output file count matches input
- Review: Spot-check complex files for accuracy
- Organize: Move to proper Maven/Gradle structure
- Fix: Address any decompilation artifacts
- Compile: Test with
mvn compile
Resources
- CFR GitHub: https://github.com/leibnitz27/cfr
- Procyon GitHub: https://github.com/mstrobel/procyon
- Fernflower GitHub: https://github.com/fesh0r/fernflower
- JD-GUI: http://java-decompiler.github.io/
- JADX GitHub: https://github.com/skylot/jadx