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 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
| package com.clay.loader;
import javax.tools.*; import java.io.*; import java.net.URI; import java.nio.CharBuffer; import java.util.HashMap; import java.util.Map;
public final class MemoryJavaFileManager extends ForwardingJavaFileManager {
private Map<String, byte[]> classBytes;
private final static String EXT = ".java";
public MemoryJavaFileManager(JavaFileManager fileManager) { super(fileManager); classBytes = new HashMap<String, byte[]>(); }
public Map<String, byte[]> getClassBytes() { return classBytes; }
@Override public void close() throws IOException { classBytes = new HashMap<String, byte[]>(); }
@Override public void flush() throws IOException {
}
@Override public JavaFileObject getJavaFileForOutput( JavaFileManager.Location location, String className, JavaFileObject.Kind kind, FileObject sibling) throws IOException { if (kind == JavaFileObject.Kind.CLASS) { return new ClassOutputBuffer(className); } else { return super.getJavaFileForOutput(location, className, kind, sibling); } }
public JavaFileObject makeStringSource(String name, String code) { return new StringInputBuffer(name, code); }
public static URI toURI(String name) { File file = new File(name); if (file.exists()) { return file.toURI(); } else { try { final StringBuilder newUri = new StringBuilder(); newUri.append("mfm:///"); newUri.append(name.replace('.', '/')); if (name.endsWith(EXT)) { newUri.replace(newUri.length() - EXT.length(), newUri.length(), EXT); } return URI.create(newUri.toString()); } catch (Exception exp) { return URI.create("mfm:///com/sun/script/java/java_source"); } } }
private static class StringInputBuffer extends SimpleJavaFileObject {
private final String code;
StringInputBuffer(String name, String code) { super(toURI(name), Kind.SOURCE); this.code = code; }
@Override public CharBuffer getCharContent(boolean ignoreEncodingErrors) { return CharBuffer.wrap(code); }
public Reader openReader() { return new StringReader(code); } }
private class ClassOutputBuffer extends SimpleJavaFileObject {
private String name;
ClassOutputBuffer(String name) { super(toURI(name), Kind.CLASS); this.name = name; }
@Override public OutputStream openOutputStream() { return new FilterOutputStream(new ByteArrayOutputStream()) { @Override public void close() throws IOException { out.close(); ByteArrayOutputStream bos = (ByteArrayOutputStream) out; classBytes.put(name, bos.toByteArray()); } }; } }
}
|