中国开发网: 论坛: Java/J2ME: 贴子 36172
JoJo
Java编译技术
XData的技术准备。虽然java可以调用编译器编译原代码,但需要创建java原代码,效率也不高,因此我打算直接在内存中生成字节码,但是难度超出我的预料。我花了将近两个小时才完成一个HelloWorld字节码生成器,大部分还是到网上四处抄的。代码还相当长。。。

package hwbuilder;
import org.apache.bcel.*;
import org.apache.bcel.generic.*;
/*
//要编译的HelloWold类
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);
}
}
*/
public class HWBuilder {
public static void main(String[] args) {
//创建空的类
InstructionList il = new InstructionList();
ClassGen cg = new ClassGen("HelloWorld",
"java.lang.Object",
"<generated>",
Constants.ACC_PUBLIC|Constants.ACC_SUPER,
null);
ConstantPoolGen cp = cg.getConstantPool();
//创建main方法
MethodGen mg = new MethodGen(Constants.ACC_PUBLIC|Constants.ACC_STATIC,
Type.VOID,new Type[]{
new ArrayType(Type.STRING, 1)
},
new String[] { "argv" },
"main", "HelloWorld", il, cp);
InstructionFactory factory = new InstructionFactory(cg);
//定义引用类型
ObjectType i_stream = new ObjectType("java.io.InputStream");
ObjectType p_stream = new ObjectType("java.io.PrintStream");
//创建命名变量 in 和 name
il.append(factory.createNew("java.io.BufferedReader"));
il.append(InstructionConstants.DUP);
il.append(factory.createNew("java.io.InputStreamReader"));
il.append(InstructionConstants.DUP);
il.append(factory.createFieldAccess("java.lang.System", "in", i_stream,
Constants.GETSTATIC));
il.append(factory.createInvoke("java.io.InputStreamReader", "<init>",
Type.VOID, new Type[] { i_stream },
Constants.INVOKESPECIAL));
il.append(factory.createInvoke("java.io.BufferedReader", "<init>", Type.VOID,
new Type[] {new ObjectType("java.io.Reader")},
Constants.INVOKESPECIAL));
//创建Local变量并初始化为null
LocalVariableGen lg = mg.addLocalVariable("in",
new ObjectType("java.io.BufferedReader"), null, null);
int in = lg.getIndex();
lg.setStart(il.append(new ASTORE(in)));

lg = mg.addLocalVariable("name", Type.STRING, null, null);
int name = lg.getIndex();
il.append(InstructionConstants.ACONST_NULL);
lg.setStart(il.append(new ASTORE(name)));
//创建 try-catch 语句块
InstructionHandle try_start =
il.append(factory.createFieldAccess("java.lang.System", "out", p_stream,
Constants.GETSTATIC));

il.append(new PUSH(cp, "Please enter your name> "));
il.append(factory.createInvoke("java.io.PrintStream", "print", Type.VOID,
new Type[] { Type.STRING },
Constants.INVOKEVIRTUAL));
il.append(new ALOAD(in));
il.append(factory.createInvoke("java.io.BufferedReader", "readLine",
Type.STRING, Type.NO_ARGS,
Constants.INVOKEVIRTUAL));
il.append(new ASTORE(name));
//创建异常跳转
GOTO g = new GOTO(null);
InstructionHandle try_end = il.append(g);
//创建异常处理
InstructionHandle handler = il.append(InstructionConstants.RETURN);
mg.addExceptionHandler(try_start,try_end,handler,new ObjectType("java.io.IOException"));
//受保护的代码
InstructionHandle ih =
il.append(factory.createFieldAccess("java.lang.System", "out", p_stream,
Constants.GETSTATIC));
g.setTarget(ih);
//输出 HelloWorld
il.append(factory.createNew(Type.STRINGBUFFER));
il.append(InstructionConstants.DUP);
il.append(new PUSH(cp, "Hello, "));
il.append(factory.createInvoke("java.lang.StringBuffer", "<init>",
Type.VOID, new Type[] { Type.STRING },
Constants.INVOKESPECIAL));
il.append(new ALOAD(name));
il.append(factory.createInvoke("java.lang.StringBuffer", "append",
Type.STRINGBUFFER, new Type[] { Type.STRING },
Constants.INVOKEVIRTUAL));
il.append(factory.createInvoke("java.lang.StringBuffer", "toString",
Type.STRING, Type.NO_ARGS,
Constants.INVOKEVIRTUAL));

il.append(factory.createInvoke("java.io.PrintStream", "println",
Type.VOID, new Type[] { Type.STRING },
Constants.INVOKEVIRTUAL));
il.append(InstructionConstants.RETURN);
//建立类结构
mg.setMaxStack();
cg.addMethod(mg.getMethod());
il.dispose();
cg.addEmptyConstructor(Constants.ACC_PUBLIC);
//生成Class文件
try {
cg.getJavaClass().dump("HelloWorld.class");
}
catch (java.io.IOException e) {
System.err.println(e);
}
}
}

相关信息:


欢迎光临本社区,您还没有登录,不能发贴子。请在 这里登录