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 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; } } }