public <T> T compileUnit(String cuPackage, String cuClass, CompilationUnit cu) {
try {
MemoryResourceReader pReader = new MemoryResourceReader();
pReader.add(cuPackage.replaceAll("\\.", "/") + "/" + cuClass + ".java", cu.toString().getBytes());
JavaCompiler compiler = new JavaCompilerFactory().loadCompiler(CompilerType.ECLIPSE, "1.8");
MemoryFileSystem pStore = new MemoryFileSystem();
CompilationResult compilationResult = compiler.compile(new String[]{cuPackage.replaceAll("\\.", "/") + "/" + cuClass + ".java"},
pReader,
pStore,
this.getClass().getClassLoader());
LOG.debug("{}", Arrays.asList(compilationResult.getErrors()));
LOG.debug("{}", Arrays.asList(compilationResult.getWarnings()));
String fqnClassName = cuPackage + "." + cuClass;
Class<T> loaded = (Class<T>) new TemplateLoader(this.getClass().getClassLoader()).load(pStore, fqnClassName);
return loaded.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}