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 );
}
}
}