2023: splashout suggests in the comments the Vineflower/vineflower decompiler (releases), renaming from Quiltflower to Vineflower.
java -jar vineflower.jar -dgs=1 c:\Temp\binary\library.jar c:\Temp\souce
2022 update: QuiltMC/quiltflower is the latest most advanced Java decompiler:
Quiltflower is a modern, general purpose decompiler focused on improving code quality, speed, and usability.
Quiltflower is a fork of Fernflower and Forgeflower.
Changes include:
- New language features (Try with resources, switch expressions, pattern matching, and more)
- Better control flow generation (loops, try-catch, and switch, etc.)
- More configurability
- Better error messages
- Javadoc application
- Multithreading
- Optimization
- Many other miscellaneous features and fixes
Originally intended just for use with the QuiltMC toolchain with Minecraft, Quiltflower quickly expanded to be a general purpose java decompiler aiming to create code that is as accurate and clean as possible.
If the name sounds familiar it's because Quiltflower is a fork of Fernflower, the (in)famous decompiler that was developed by Stiver, maintained by Jetbrains, and became the default decompiler in Intellij IDEA.
Fernflower also quickly found its way into many other tools.Over the past year, Quiltflower has added support for features such as modern string concatenation, a code formatter, sealed classes, pattern matching, switch expressions, try-with-resources, and more. Quiltflower also focuses on the code quality of the decompiled output, and takes readability very seriously.
See output examples.
Runs nice with jbang
https://github.com/QuiltMC/quiltflower/releases/download/1.8.1/quiltflower-1.8.1.jar
Or:
java -jar quiltflower.jar -dgs=1 c:\Temp\binary\library.jar c:\Temp\binary\Boot.class c:\Temp\source\
2009: JavaDecompiler can do a good job with a jar: since 0.2.5, All files, in JAR files, are displayed.
See also the question "How do I “decompile” Java class files?".
The JD-Eclipse doesn't seem to have changed since late 2009 though (see Changes).
So its integration with latest Eclipse (3.8, 4.2+) might be problematic.
JD-Core is actively maintained.
Both are the result of the fantastic work of (SO user) Emmanuel Dupuy.
2018: A more modern option, mentioned in the comments by David Kennedy Araujo:
JetBrains/intellij-community/plugins/java-decompiler/engine
Fernflower is the first actually working analytical decompiler for Java and probably for a high-level programming language in general.
java -jar fernflower.jar [-<option>=<value>]* [<source>]+ <destination> java -jar fernflower.jar -hes=0 -hdc=0 c:\Temp\binary\ -e=c:\Java\rt.jar c:\Temp\source\
See also How to decompile to java files intellij idea for a command working with recent IntelliJ IDEA.
2022 update: Florian Wendelborn suggests in the comments
Answer from VonC on Stack Overflowthis one works well: jdec.app from Leonardo Santos.
Videos
java - How to decompile a whole Jar file? - Stack Overflow
decompilation - What is a good Java decompiler and deobfuscator? - Reverse Engineering Stack Exchange
decompiler - How do I "decompile" Java class files? - Stack Overflow
Show HN: I wrote a Java decompiler in pure C language
I have a couple of .jar games on my disk. I want to decompile the bytecode back to the readable .java format.
What are my options? Google wasn't very helpful, throwing old sites at me with broken download links.
I just want to learn - I played the game lots of times so I know what it does, now I want to know how it does it.
EDIT: Thanks to everyone who replied, the post stays so that others can use. I decided to use jd-gui, but it's good to know many Java IDEs have plugins to do this too (I use Netbeans and I couldn't find a decompiler plugin for it)
2023: splashout suggests in the comments the Vineflower/vineflower decompiler (releases), renaming from Quiltflower to Vineflower.
java -jar vineflower.jar -dgs=1 c:\Temp\binary\library.jar c:\Temp\souce
2022 update: QuiltMC/quiltflower is the latest most advanced Java decompiler:
Quiltflower is a modern, general purpose decompiler focused on improving code quality, speed, and usability.
Quiltflower is a fork of Fernflower and Forgeflower.
Changes include:
- New language features (Try with resources, switch expressions, pattern matching, and more)
- Better control flow generation (loops, try-catch, and switch, etc.)
- More configurability
- Better error messages
- Javadoc application
- Multithreading
- Optimization
- Many other miscellaneous features and fixes
Originally intended just for use with the QuiltMC toolchain with Minecraft, Quiltflower quickly expanded to be a general purpose java decompiler aiming to create code that is as accurate and clean as possible.
If the name sounds familiar it's because Quiltflower is a fork of Fernflower, the (in)famous decompiler that was developed by Stiver, maintained by Jetbrains, and became the default decompiler in Intellij IDEA.
Fernflower also quickly found its way into many other tools.Over the past year, Quiltflower has added support for features such as modern string concatenation, a code formatter, sealed classes, pattern matching, switch expressions, try-with-resources, and more. Quiltflower also focuses on the code quality of the decompiled output, and takes readability very seriously.
See output examples.
Runs nice with jbang
https://github.com/QuiltMC/quiltflower/releases/download/1.8.1/quiltflower-1.8.1.jar
Or:
java -jar quiltflower.jar -dgs=1 c:\Temp\binary\library.jar c:\Temp\binary\Boot.class c:\Temp\source\
2009: JavaDecompiler can do a good job with a jar: since 0.2.5, All files, in JAR files, are displayed.
See also the question "How do I “decompile” Java class files?".
The JD-Eclipse doesn't seem to have changed since late 2009 though (see Changes).
So its integration with latest Eclipse (3.8, 4.2+) might be problematic.
JD-Core is actively maintained.
Both are the result of the fantastic work of (SO user) Emmanuel Dupuy.
2018: A more modern option, mentioned in the comments by David Kennedy Araujo:
JetBrains/intellij-community/plugins/java-decompiler/engine
Fernflower is the first actually working analytical decompiler for Java and probably for a high-level programming language in general.
java -jar fernflower.jar [-<option>=<value>]* [<source>]+ <destination> java -jar fernflower.jar -hes=0 -hdc=0 c:\Temp\binary\ -e=c:\Java\rt.jar c:\Temp\source\
See also How to decompile to java files intellij idea for a command working with recent IntelliJ IDEA.
2022 update: Florian Wendelborn suggests in the comments
this one works well: jdec.app from Leonardo Santos.
First of all, it's worth remembering that all Java archive files (.jar/.war/etc...) are all basically just fancy.zip files, with a few added manifests and metadata.
Second, to tackle this problem I personally use several tools which handle this problem on all levels:
- Jad + Jadclipse while working in IDE for decompiling
.classfiles - WinRAR, my favorite compression tool natively supports Java archives (again, see first paragraph).
- Beyond Compare, my favorite diff tool, when configured correctly can do on-the-fly comparisons between any archive file, including
jars. Well worth a try.
The advantage of all the aforementioned, is that I do not need to hold any other external tool which clutters my work environment. Everything I will ever need from one of those files can be handled inside my IDE or diffed with other files natively.
There is the open source Java decompiler, Procyon.
I have not tested it against any obfuscated code, but I have seen it decompile many methods that JD-GUI failed to handle. Note that it's a work in progress, and I'm sure you will find plenty of code that it will fail to decompile.
Old and Lacking Entries
JAD Some time ago, everyone’s decompiler of choice was jad. Currently, the project is dead (in addition, it wasn’t open source), but still you see a lot of people referring to it.
Java DeObfuscator Also an older tool from fileoffset.com, but still works more or less. The interface is rather clunky to use for larger projects, but the tool is open source.
JODE JODE is a java package containing a decompiler and an optimizer for Java. This package is freely available under the GNU GPL. It hasn’t been updated for quite some time.
AndroChef Proprietary tool to decompile Android programs and Java files, available here. Not worth the money given the alternatives, just as DJ Decompiler.
Candle An open source decompiler by Brad Davis. I’m mentioning it for completeness, but is far away from being feature complete.
Modern Tools
JD-Gui Probably one of the most widely used tools for Java decompilation, as it is easy to use and provides a graphical user interface which allows to quickly open up and inspect a class file or JAR. You can find it over here.
FernFlower Very new and promising analytical Java decompiler (becoming an integral part of IntelliJ 14).
It’s a command line tool. This one is able to show the Unicode parameters with their full name.
Download from here.
It’s a command line tool. This one is able to show the Unicode parameters with their full name.
Note that it's also already integrated by default in IntelliJ.
CFR
Free, and open source. This one aims to decompile modern Java features, including Java 12 switch expressions, Java 8 lambdas (pre and post Java beta 103 changes), Java 7 String switches etc., though is itself written in Java 6.
Also a command line tool. This one does an even better job and is slightly faster.
Procyon
Open source, and also aims to deal with Java 8 features (lambdas, :: operator). Needs Java 7 to run.
Krakatau Krakatau is interesting because it has been written in Python. It currently contains three tools: a decompiler and disassembler for Java class files and an assembler to create class files.
Does not yet support Java 8 features.
Soot
Soot is a framework for analyzing and transforming Java and Android applications, originally developed by the Sable Research Group of McGill University. It’s not very commonly used “just” as a decompiler, as it also defines an intermediate byte code language.
Recaf
A Java Bytecode editor and reverse engineering tool aimed at being intuitive to use. It can present bytecode through multiple decompilers (CFR, FernFlower, Procyon) or in a table layout to allow displaying class elements that are indecipherable in standard decompilers. Recaf uses context-sensitive menus to interact with classes, methods, and fields, allowing users to search for use cases, rename items, and edit definitions in a disassembled format.
It supports jars, wars, classes, and extracting classes from running Java processes.
It is written completely in Java and is fully open source.
Konloch’s Bytecode Viewer
An Advanced Lightweight Java Bytecode Viewer, GUI Java Decompiler, GUI Bytecode Editor, GUI Smali, GUI Baksmali, GUI APK Editor, GUI Dex Editor, GUI APK Decompiler, GUI DEX Decompiler, GUI Procyon Java Decompiler, GUI Krakatau, GUI CFR Java Decompiler, GUI FernFlower Java Decompiler, GUI DEX2Jar, GUI Jar2DEX, GUI Jar-Jar, Hex Viewer, Code Searcher, Debugger and more.
Written completely in Java, and it’s open source.
It uses FernFlower, Procyon and CFR for decompilation, makes this an awesome visual tool using state-of-art decompilers:
Enigma
A tool specifically geared for deobfuscation:
Originally used to deobfuscate Minecraft versions. Uses Procyon internally.
A more up to date fork can be found here
It’s fun to note that a lot of effort into decompilers and de-obfuscators for Java is the result of the modding scene around Minecraft, one of the most popular games implemented in Java.
Source: http://blog.macuyiko.com/post/2015/a-quick-look-at-java-decompilers.html
Update February 2016:
www.javadecompilers.com lists JAD as being:
the most popular Java decompiler, but primarily of this age only. Written in C++, so very fast.
Outdated, unsupported and does not decompile correctly Java 5 and later
So your mileage may vary with recent jdk (7, 8).
The same site list other tools.
And javadecompiler, as noted by Salvador Valencia in the comments (Sept 2017), offers a SaaS where you upload the .class file to the cloud and it returns you the decompiled code.
Original answer: Oct. 2008
- The final release of JSR 176, defining the major features of J2SE 5.0 (Java SE 5), has been published on September 30, 2004.
- The lastest Java version supported by JAD, the famous Java decompiler written by Mr. Pavel Kouznetsov, is JDK 1.3.
- Most of the Java decompilers downloadable today from the Internet, such as “DJ Java Decompiler” or “Cavaj Java Decompiler”, are powered by JAD: they can not display Java 5 sources.
Java Decompiler (Yet another Fast Java decompiler) has:
- Explicit support for decompiling and analyzing Java 5+ “.class” files.
- A nice GUI:
It works with compilers from JDK 1.1.8 up to JDK 1.7.0, and others (Jikes, JRockit, etc.).
It features an online live demo version that is actually fully functional! You can just drop a jar file on the page and see the decompiled source code without installing anything.
There are a few decompilers out there... A quick search yields:
- Procyon: open-source (Apache 2) and actively developed
- Krakatau: open-source (GPLv3) and actively developed
- CFR: open-source (MIT) and actively developed
- JAD
- DJ Java Decompiler
- Mocha
And many more.
These produce Java code. Java comes with something that lets you see JVM byte code (javap).
Check out:
- Krakatau; the author is active on stackoverflow.com.
- CFR
- Procyon decompiler
- Fernflower and mirror
- mstrobel/procyon's Java Decompiler, actively developed
Here's a recent discussion with participation from procyon's author (BonesJustice) and Krakatau's author (Uncaffeinated): http://www.reddit.com/r/ReverseEngineering/comments/1fb1to/new_open_source_java_decompiler/