!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)
JavaClass baked = cg.getJavaClass();
}
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());
}
}