Saturday, 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?