package scotch.util; import static java.lang.System.out; import static java.util.stream.Collectors.toList; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.List; import lombok.AllArgsConstructor; import scotch.compiler.output.GeneratedClass; @AllArgsConstructor public class BytecodeClassLoader extends ClassLoader { private final String testMethod; public Class<?> define(GeneratedClass generatedClass) { byte[] bytes = generatedClass.getBytes(); File file = new File("build/generated-test-classes/" + testMethod + "/" + generatedClass.getClassName().replace('.', '/') + ".class"); file.getParentFile().mkdirs(); try (OutputStream classFile = new FileOutputStream(file)) { classFile.write(bytes); classFile.flush(); out.println("Class file written to: " + file.getAbsolutePath()); } catch (IOException exception) { exception.printStackTrace(out); } return defineClass(generatedClass.getClassName(), bytes, 0, bytes.length); } public List<Class<?>> defineAll(List<GeneratedClass> generatedClasses) { return generatedClasses.stream() .map(this::define) .collect(toList()); } }