Digital Stronghold

June 16, 2007

Java bytecode disassembly

In every programmer’s journey, the legendary “Hello World!” program excuses no one. So I wrote, compiled, then disassembled it.

public class Hello {
	
	public static void main(String[] args) {
		System.out.println("Hello World!");
	}
	
}

I fired up a hex editor to analyze the bytecode’s disassembly. This part contains the headers, class name and the superclass being extended. This is how a JDK 1.5-compiled bytecode looks.

.bytecode 49.0
.source "Hello.java"
	
.class public Hello
.super java/lang/Object

By default, a constructor is generated. Check that it constructs itself as an object of type ‘Object’ naturally because Java classes extend the ‘Object’ class. Here we have shown that a constructor is just a method.

.method public ()V
  .limit stack 1
  .limit locals 1
  .line 1
    aload_0 ; met001_slot000
    invokespecial java/lang/Object.()V
    return
.end method

Here’s the main method.

.method public static main([Ljava/lang/String;)V
  .limit stack 2
  .limit locals 1
  .line 4
    getstatic java/lang/System.out Ljava/io/PrintStream;
    ldc "Hello World!"
    invokevirtual java/io/PrintStream.println(Ljava/lang/String;)V
  .line 5
    return
.end method

Easy isn’t it?

Theme designed by Joset Anthony Zamora