Monday, June 1, 2009

ByteCode Back to Java Source Code !!

I have always thought about the title of this blog entry, ever since I started learning Java. But, until recently, I had no idea about the same. I didn't knew that something magical existed that would perform this conversion. But now since I know a bit, I thought I better share it.

Java Decompiler
As you would have guessed by now, a Java Decompiler is a computer program capable of reversing the work done by a Compiler. In essence, it can convert back the Bytecode (the .class file) into the source code (the .java file).
There are many decompilers that exist today, but we will talk about the most widely used JD - Java Decompiler, which is available both as a stand-alone GUI program and as an Eclipse-plugin.

To install and use these tools are a breeze and would not take you more than a few minutes to get accustomed to it. Hence, I would not repeat the process that's already mentioned on their site.

One thing that we must note here is that the process of conversion might NOT result into 100% exact code, i.e. the generated Java file might not match the actual Java code character by character. However, most of the code would be replicated but things like variable & function names or some other minor details may differ.

Lets have a look at the JD-GUI, stand-alone tool, written in C++;making it pretty fast to execute(decompile) and display the result. Also, it is independent of the the Java Runtime Environment and thus no setup is required to install it.

Lets test the tool now.

Example Java Code:
public class test{
public static void main(String[] args){
System.out.println("Hello world");
}
}


Compile it: javac test.java
so that we have ByteCode (test.class file) with us now.

Decompile it using any one of the following ways:
  1. Execute the following on the command line: jdi-gui.exe test.class
  2. Select 'Open File' from the menu, browse to get to the test.class file and open it
  3. Drag and Drop the test.class file into the JD-GUI tool
All of the above situations result in generating the following Java Code, have a look:

import java.io.PrintStream;

public class test
{
public static void main(String[] paramArrayOfString)
{
System.out.println("Hello world");
}
}

Well just by seeing JD perform really well on this simple example, we cannot decide how efficient is this tool. But, still it is a tool that every Java Developer must be aware of. Because, in case you have accidently deleted your Java files and are left with only the .class files, this is the tool that can save your neck. :-)

4 comments:

Red said...

Could not convert socket to TLS;

What's the cause of this error? I'm using NETBEANS 6.5, GLASSFISH V3 and JAVA MAIL API.

Any ideas?

Thanks for your help.

Sushant Jawanjal said...

I have also found out some good java examples at www.sourcecode3s.com like the one provided here. :)

Santhosh K S said...

It's very good. Till now i did't know about this.

Santhosh K S said...

It's very good. I didn't know about this till now.