Thomas Darimont
Erfahrenes Mitglied
Hallo,
hier mal ein Beispiel wie man mit der im JDK integrierten BCEL Bibliothek Bytecode Programmatisch generieren kann - genauer gesagt lassen wir uns Code für eine beliebige Java-Klasse generieren der Bytecode-Instruktionen erzeugt welcher den ursprünglichen Bytecode der Klasse generiert. Sehr interessant für kleine Bytecodeexperimente
Ausgabe:
Gruß Tom
hier mal ein Beispiel wie man mit der im JDK integrierten BCEL Bibliothek Bytecode Programmatisch generieren kann - genauer gesagt lassen wir uns Code für eine beliebige Java-Klasse generieren der Bytecode-Instruktionen erzeugt welcher den ursprünglichen Bytecode der Klasse generiert. Sehr interessant für kleine Bytecodeexperimente

Java:
package de.tutorials;
import com.sun.org.apache.bcel.internal.classfile.JavaClass;
import com.sun.org.apache.bcel.internal.util.BCELifier;
import com.sun.org.apache.bcel.internal.util.ClassLoaderRepository;
public class BytecodeFun {
public static void main(String[] args) throws Exception{
ClassLoaderRepository clRepo = new ClassLoaderRepository(X.class.getClassLoader());
JavaClass clazz = clRepo.loadClass(X.class.getName());
BCELifier bcelifier = new BCELifier(clazz,System.out);
bcelifier.start();
}
public static class X{
private int a;
protected String b;
public int op(String arg){
return Integer.parseInt(arg);
}
}
}
Ausgabe:
Code:
package de.tutorials;
import com.sun.org.apache.bcel.internal.generic.*;
import com.sun.org.apache.bcel.internal.classfile.*;
import com.sun.org.apache.bcel.internal.*;
import java.io.*;
public class BytecodeFun$XCreator implements Constants {
private InstructionFactory _factory;
private ConstantPoolGen _cp;
private ClassGen _cg;
public BytecodeFun$XCreator() {
_cg = new ClassGen("de.tutorials.BytecodeFun$X", "java.lang.Object", "BytecodeFun.java", ACC_PUBLIC | ACC_SUPER, new String[] { });
_cp = _cg.getConstantPool();
_factory = new InstructionFactory(_cg, _cp);
}
public void create(OutputStream out) throws IOException {
createFields();
createMethod_0();
createMethod_1();
_cg.getJavaClass().dump(out);
}
private void createFields() {
FieldGen field;
field = new FieldGen(ACC_PRIVATE, Type.INT, "a", _cp);
_cg.addField(field.getField());
field = new FieldGen(ACC_PROTECTED, Type.STRING, "b", _cp);
_cg.addField(field.getField());
}
private void createMethod_0() {
InstructionList il = new InstructionList();
MethodGen method = new MethodGen(ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, "<init>", "de.tutorials.BytecodeFun$X", il, _cp);
InstructionHandle ih_0 = il.append(_factory.createLoad(Type.OBJECT, 0));
il.append(_factory.createInvoke("java.lang.Object", "<init>", Type.VOID, Type.NO_ARGS, Constants.INVOKESPECIAL));
InstructionHandle ih_4 = il.append(_factory.createReturn(Type.VOID));
method.setMaxStack();
method.setMaxLocals();
_cg.addMethod(method.getMethod());
il.dispose();
}
private void createMethod_1() {
InstructionList il = new InstructionList();
MethodGen method = new MethodGen(ACC_PUBLIC, Type.INT, new Type[] { Type.STRING }, new String[] { "arg0" }, "op", "de.tutorials.BytecodeFun$X", il, _cp);
InstructionHandle ih_0 = il.append(_factory.createLoad(Type.OBJECT, 1));
il.append(_factory.createInvoke("java.lang.Integer", "parseInt", Type.INT, new Type[] { Type.STRING }, Constants.INVOKESTATIC));
InstructionHandle ih_4 = il.append(_factory.createReturn(Type.INT));
method.setMaxStack();
method.setMaxLocals();
_cg.addMethod(method.getMethod());
il.dispose();
}
public static void _main(String[] args) throws Exception {
de.tutorials.BytecodeFun$XCreator creator = new de.tutorials.BytecodeFun$XCreator();
creator.create(new FileOutputStream("de.tutorials.BytecodeFun$X.class"));
}
}
Gruß Tom