package com.ruoyi.buss.common.dynamic; import javax.tools.*; import java.util.*; import java.io.ByteArrayOutputStream; import java.io.OutputStream; import java.net.URI; public class MemoryJavaFileManager extends ForwardingJavaFileManager { private final Map classBytes = new HashMap<>(); private final ClassLoader loader; public MemoryJavaFileManager(JavaFileManager fileManager) { super(fileManager); this.loader = new ClassLoader() { @Override protected Class findClass(String name) throws ClassNotFoundException { byte[] buf = classBytes.get(name); if (buf == null) throw new ClassNotFoundException(name); return defineClass(name, buf, 0, buf.length); } }; } @Override public JavaFileObject getJavaFileForOutput(Location location, String className, JavaFileObject.Kind kind, FileObject sibling) { return new MemoryOutputJavaFileObject(className); } public ClassLoader getClassLoader() { return loader; } class MemoryOutputJavaFileObject extends SimpleJavaFileObject { private final String name; MemoryOutputJavaFileObject(String name) { super(URI.create("mem:///" + name.replace('.','/') + Kind.CLASS.extension), Kind.CLASS); this.name = name; } @Override public OutputStream openOutputStream() { return new ByteArrayOutputStream() { @Override public void close() { classBytes.put(name, toByteArray()); } }; } } }