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?
