JDasm: Java Disassembler
Last Modification: 09 February 2011

A simple HalloWorld class

Consider this Java class:
import java.io.*;

public class HelloWorld {
  public static void main(String[] argv) {
    BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    String name = null;

    try {
        System.out.print("Please enter your name> ");
        name = in.readLine();
    } catch(IOException e) { return; }

    System.out.println("Hello, " + name);
  }
}
This could be the corrispondent java produced with JDasm.
import java.io.*;
import org.ldp.jdasm.*;
import org.ldp.jdasm.attribute.*;
import org.ldp.jdasm.attribute.instruction.*;
import org.ldp.jdasm.attribute.instruction.opcode.*;
import org.ldp.jdasm.exception.*;

public class JDASM_HelloWorldBuilder {

  public static void build()
  {
    try {
      DClass d = new DClass("HelloWorld");

      DMethod m = d.addMethod( "public static void main( java.lang.String[] argv )");
      CodeAttribute code = m.getCodeAttribute();

      Instruction start1 = code.addCode(new NEW("java/io/BufferedReader"));
      code.addCode(new DUP());
      code.addCode(new NEW("java/io/InputStreamReader"));
      code.addCode(new DUP());
      code.addCode(new GETSTATIC("java/lang/System in Ljava/io/InputStream;"));
      code.addCode(new INVOKESPECIAL("java/io/InputStreamReader <init> (Ljava/io/InputStream;)V"));
      code.addCode(new INVOKESPECIAL("java/io/BufferedReader <init> (Ljava/io/Reader;)V"));
      Instruction start2 = code.addCode(new ASTORE_1());
      code.addCode(new ACONST_NULL());
      Instruction start3 = code.addCode(new ASTORE_2());
      Instruction tryStart = code.addCode(new GETSTATIC("java/lang/System out Ljava/io/PrintStream;"));
      code.addCode(new LDC("Please enter your name> ", false));
      code.addCode(new INVOKEVIRTUAL("java/io/PrintStream print (Ljava/lang/String;)V"));
      code.addCode(new ALOAD_1());
      code.addCode(new INVOKEVIRTUAL("java/io/BufferedReader readLine ()Ljava/lang/String;"));
      code.addCode(new ASTORE_2());
      Instruction go = code.addCode(new GOTO());
      Instruction catchStart = code.addCode(new RETURN());
      go.setJumpTarget( code.addCode(new GETSTATIC("java/lang/System out Ljava/io/PrintStream;")) );
      code.addCode(new NEW("java/lang/StringBuffer"));
      code.addCode(new DUP());
      code.addCode(new LDC("Hallo, ", false));
      code.addCode(new INVOKESPECIAL("java/lang/StringBuffer <init> (Ljava/lang/String;)V"));
      code.addCode(new ALOAD_2());
      code.addCode(new INVOKEVIRTUAL("java/lang/StringBuffer append (Ljava/lang/String;)Ljava/lang/StringBuffer;"));
      code.addCode(new INVOKEVIRTUAL("java/lang/StringBuffer toString ()Ljava/lang/String;"));
      code.addCode(new INVOKEVIRTUAL("java/io/PrintStream println (Ljava/lang/String;)V"));
      Instruction end = code.addCode(new RETURN());


      code.addException(new ExceptionElement(tryStart,catchStart,catchStart, "java/io/IOException"));
      
      LocalVariableTableAttribute tab = (LocalVariableTableAttribute)code.addAttribute(new LocalVariableTableAttribute());
      tab.add( new LocalVariableTableElement(start1, end, "argv", "Ljava/lang/String;", 0));
      tab.add( new LocalVariableTableElement(start2, end, "in", "Ljava/io/BufferedReader;", 1));
      tab.add( new LocalVariableTableElement(start3, end, "name", "Ljava/lang/String;", 2));

      d.addEmptyConstructor();

      d.addAttribute(new SourceFileAttribute("<generated>"));

      // * build
      d.build();
      
      FileOutputStream fos = new FileOutputStream("HelloWorld.class");
      fos.write(d.toBytecode());
      fos.close();
            
    } catch( CodeParseException e) {
      System.out.println("CodeParseException: " + e );
    } catch( IOException e ) {
      System.out.println("IOException: " + e );
    }
  }
}