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<JavaFileManager> {
|
private final Map<String, byte[]> 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());
|
}
|
};
|
}
|
}
|
}
|