Decompile Java Class file using decompilers.

Byte codes generated by javac compiler can again be converted into java source. For this we need a decompiler tool. Decompilers are the utilities that generate the source code from input java class file. A Decompiler knows about the structure of a Java class and parse it to generated Java source code. Java decompilers will not give the exact Java source file from which class was generated and executed by Java Virtual Machine. But most of the structure will be maintained.

JAD: Java Decompiler

A lot of Decompilers are available in the market to decompile a class file. We will use one of the free decomipler called JAD. You can download JAD compiler from here. Update: JAD’s site is down hence you can download it from this link. I have used a simple Hello World java class to demonstrate JAD decompiler. Following is the code of HelloWorld.java file.
public class HelloWorld { public static void main(String args[]) { String fooBar = "Hello World from Java."; System.out.println(fooBar); } }
Code language: Java (java)
Use following output when we use command line utility JAD to decompile our class file.
$> jad HelloWorld.class Parsing HelloWorld.class... Generating HelloWorld.jad
Code language: HTML, XML (xml)
The source file output of JAD is in file with .jad extension. You can change the extension to .java. Following is the source that you get after decompillng our HelloWorld.class file.
// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov. // Jad home page: http://www.kpdus.com/jad.html // Decompiler options: packimports(3) // Source File Name: HelloWorld.java import java.io.PrintStream; public class HelloWorld { public HelloWorld() { } public static void main(String args[]) { String s = "Hello World from Java."; System.out.println(s); } }
Code language: Java (java)
Note that the string variable that we used in our original Java class was fooBar and it got changed into s. Any idea why so?

View Comments

  • The reason for the change is Refactorization/Optimization , when the compiler is compiling the source it`s grabbing the long variable names in this case "FooBar" and replace it to some shorter versions for example "s" i think that most of the compilers are doing it.

  • Your wordpress theme generates an error:

    Warning: ob_start() [ref.outcontrol]: output handler 'ob_gzhandler' cannot be used twice in /home/viralpat/public_html/blogs/wp-content/themes/wp-max/header.php on line 1

  • Hi Jakob,
    Thanks for pointing out the error. Actually I was trying to enable GZip compression for my website and hence was playing with .htaccess ;)
    Are you still getting the error?

  • To achieve better results (including for Java 1.5+ classes) in decompilation, process the classes with JadRetro (jadretro.sf.net) tool before decompiling them by Jad.
    Of course, it doesn't help in your case with "fooBar" variable because javac doesn't put local variable names to the generated class file unless instructed to do so (-g:vars).

  • Thank you for sharing so much information. May be this information would help me in developing an application in future. Right now i am excited to go to attend the Sun Tech Days 2010 conference in Hyderabad. Experts are going to share ideas on new technologies there.

Share
Published by
Viral Patel
Tags: decompile java class decompiler jad decompiler Java java class file java decompiler

Recent Posts

  • Java

Java URL Encoder/Decoder Example

Java URL Encoder/Decoder Example - In this tutorial we will see how to URL encode/decode…

4 years ago
  • General

How to Show Multiple Examples in OpenAPI Spec

Show Multiple Examples in OpenAPI - OpenAPI (aka Swagger) Specifications has become a defecto standard…

4 years ago
  • General

How to Run Local WordPress using Docker

Local WordPress using Docker - Running a local WordPress development environment is crucial for testing…

4 years ago
  • Java

Create and Validate JWT Token in Java using JJWT

1. JWT Token Overview JSON Web Token (JWT) is an open standard defines a compact…

4 years ago
  • Spring Boot

Spring Boot GraphQL Subscription Realtime API

GraphQL Subscription provides a great way of building real-time API. In this tutorial we will…

4 years ago
  • Spring Boot

Spring Boot DynamoDB Integration Test using Testcontainers

1. Overview Spring Boot Webflux DynamoDB Integration tests - In this tutorial we will see…

4 years ago