!include #1019934 // BCEL // A = interface we are implementing sclass ClassMaker { S className; ClassGen cg; JavaClass baked; ClassLoader classLoader; Class loadedClass; *(Class interfaceToImplement) { className = randomClassName(); cg = new ClassGen(className, "java.lang.Object", null, Const.ACC_PUBLIC, new S[] { className(interfaceToImplement) }); cg.addEmptyConstructor(Const.ACC_PUBLIC); } JavaClass bake() { if (baked == null) baked = cg.getJavaClass(); ret baked; } void printClassWithMethods() { // print class overview print(bake()); // print the methods for (method : baked.getMethods()) { print("\n" + method); print(method.getCode()); } } simplyCached byte[] toBytes() { ret bake().getBytes(); } Class load() { if (loadedClass == null) { var bytes = toBytes(); classLoader = new InMemoryClassLoader(myClassLoader()); loadedClass = (Class) classLoader.defineAClass(className, bytes); } ret loadedClass; } A newInstance() { ret newInstance(load()); } }