13693261870
2025-07-02 6708810c4de34dfb9513061432d656f91d56ee3a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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;
        }
    }
}