public static Object execute(Function<Scope, BytecodeNode> nodeGenerator, ParameterizedType returnType, Optional<ClassLoader> parentClassLoader) throws Exception { ClassDefinition classDefinition = new ClassDefinition( a(PUBLIC, FINAL), uniqueClassName("test", "Test"), type(Object.class)); MethodDefinition method = classDefinition.declareMethod(a(PUBLIC, STATIC), "test", returnType); BytecodeNode node = nodeGenerator.apply(method.getScope()); method.getBody().append(node); String tree = dumpBytecodeTree(classDefinition); if (DUMP_BYTECODE_TREE.get()) { System.out.println(tree); } ClassLoader classLoader = parentClassLoader.orElse(BytecodeExpressionAssertions.class.getClassLoader()); return classGenerator(classLoader) .defineClass(classDefinition, Object.class) .getMethod("test") .invoke(null); } }