package com.ruoyi.buss.common.dynamic;
|
|
import javax.tools.*;
|
import java.net.URI;
|
import java.util.List;
|
|
public class DynamicCompiler {
|
|
private final JavaCompiler compiler;
|
private final StandardJavaFileManager stdFileManager;
|
|
public DynamicCompiler() {
|
this.compiler = ToolProvider.getSystemJavaCompiler();
|
this.stdFileManager = compiler.getStandardFileManager(null, null, null);
|
}
|
|
public Class<?> compile(String className, String sourceCode) throws Exception {
|
MemoryJavaFileManager fileManager = new MemoryJavaFileManager(stdFileManager);
|
JavaFileObject javaFile = new StringJavaFileObject(className, sourceCode);
|
|
List<String> options = List.of("--enable-preview", "--add-modules=jdk.compiler");
|
compiler.getTask(null, fileManager, null, options, null, List.of(javaFile)).call();
|
|
return fileManager.getClassLoader().loadClass(className);
|
}
|
|
private static class StringJavaFileObject extends SimpleJavaFileObject {
|
private final String code;
|
|
protected StringJavaFileObject(String name, String code) {
|
super(URI.create("string:///" + name.replace('.','/') + Kind.SOURCE.extension), Kind.SOURCE);
|
this.code = code;
|
}
|
|
@Override
|
public CharSequence getCharContent(boolean ignoreEncodingErrors) {
|
return code;
|
}
|
}
|
}
|