# 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
```bash
# 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
```bash
# 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
```bash
# 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

1. **Batch processing**: Use xargs or scripts for multiple files
2. **Memory**: Set appropriate heap size for large projects
3. **Parallel**: Process multiple files in parallel
4. **Filtering**: Skip test classes if not needed

## Post-Decompilation

After decompiling:

1. **Verify**: Check output file count matches input
2. **Review**: Spot-check complex files for accuracy
3. **Organize**: Move to proper Maven/Gradle structure
4. **Fix**: Address any decompilation artifacts
5. **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
