!7 set flag AllPublic. !include once #1019934 // BCEL import org.apache.bcel.Const; import org.apache.bcel.generic.*; replace BType with org.apache.bcel.generic.Type. p { ClassGen cg = new("User123", "java.lang.Object", null, Const.ACC_PUBLIC, new S[] { className(IF0) }); cg.addEmptyConstructor(Const.ACC_PUBLIC); // make code for get() method new InstructionList il; ConstantPoolGen cp = cg.getConstantPool(); var factory = new InstructionFactory(cg); var mg = new MethodGen(Const.ACC_PUBLIC, new ObjectType(className(/*S*/O)), // String doesn't work new BType[] {}, null, "get", cg.getClassName(), il, cp); // create empty StringBuffer, store in local variable int iBuffer = 1; // local variable index il.append(factory.createNew("java.lang.StringBuffer")); il.append(InstructionConst.DUP); il.append(factory.createInvoke("java.lang.StringBuffer", "", BType.VOID, new BType[] {}, Const.INVOKESPECIAL)); il.append(new ASTORE(iBuffer)); // Append twice for (string : ll("Hello ", "world")) { il.append(new ALOAD(iBuffer)); il.append(new PUSH(cp, string)); il.append(factory.createAppend(org.apache.bcel.generic.Type.OBJECT)); } // call StringBuffer.toString() and return il.append(new ALOAD(iBuffer)); il.append(factory.createInvoke("java.lang.StringBuffer", "toString", new ObjectType("java.lang.String"), new BType[] {}, Const.INVOKEVIRTUAL)); il.append(InstructionConst.ARETURN); mg.stripAttributes(true); mg.setMaxStack(); mg.setMaxLocals(); cg.addMethod(mg.getMethod()); // bake class JavaClass baked = cg.getJavaClass(); // print class overview print(baked); // print the methods for (method : baked.getMethods()) { print("\n" + method); print(method.getCode()); } byte[] bytes = baked.getBytes(); var cl = new InMemoryClassLoader(myClassLoader()); time "Defining class" { Class c = cast cl.defineAClass("User123", bytes); } print(c); IF0 f = newInstance(c); print(f); assertEqualsVerbose("Hello world", f!); }