fork download
  1. import java.io.ByteArrayOutputStream;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.io.OutputStream;
  5. import java.io.Reader;
  6. import java.io.Writer;
  7. import java.net.URI;
  8. import java.net.URISyntaxException;
  9. import java.util.Arrays;
  10. import java.util.HashMap;
  11. import java.util.Iterator;
  12. import java.util.List;
  13. import java.util.Map;
  14. import java.util.ServiceLoader;
  15. import java.util.Set;
  16.  
  17. import javax.lang.model.element.Modifier;
  18. import javax.lang.model.element.NestingKind;
  19. import javax.tools.FileObject;
  20. import javax.tools.JavaCompiler;
  21. import javax.tools.JavaFileManager;
  22. import javax.tools.JavaFileObject;
  23. import javax.tools.JavaFileObject.Kind;
  24. import javax.tools.ToolProvider;
  25.  
  26. class Ideone {
  27. public static void main(String[] args) throws Exception {
  28. String name="Test";
  29. String src="public class Test {\r\n" +
  30. " public static void main(String[] args) {\r\n" +
  31. " System.out.println(\"Hello \"+args[0]+\"!\");\r\n" +
  32. " }\r\n" +
  33. "}";
  34. System.out.println(src);
  35. List<JFO> sources=Arrays.asList(new JFO(name,src));
  36. Map<String,JFO> files=new HashMap<>();
  37. JavaCompiler jc=ToolProvider.getSystemJavaCompiler();
  38. JavaCompiler.CompilationTask ct=jc.getTask(null, new JFM(jc.getStandardFileManager(null, null, null),files), null, null, null, sources);
  39. System.out.println(ct.call());
  40. Class<?> clazz=new CL().defineClass(name, files.get(name).baos.toByteArray());
  41. clazz.getDeclaredMethod("main", String[].class).invoke(null, (Object)new String[] {"StackOverflow"});
  42. }
  43.  
  44. static class JFO implements JavaFileObject {
  45. final String name;
  46. final String src;
  47. JFO(String name,String src){
  48. this.name=name;
  49. this.src=src;
  50. }
  51. @Override
  52. public URI toUri() {
  53. URI uri=null;
  54. try {
  55. uri=new URI(name);
  56. }catch(URISyntaxException use) {use.printStackTrace();};
  57. System.out.println("toUri "+uri);
  58. return uri;
  59. }
  60.  
  61. @Override
  62. public String getName() {
  63. System.out.println("getName "+name);
  64. return name;
  65. }
  66.  
  67. @Override
  68. public InputStream openInputStream() throws IOException {
  69. throw new Error();
  70. }
  71.  
  72. @Override
  73. public OutputStream openOutputStream() throws IOException {
  74. System.out.println("openOutputStream");
  75. if(baos!=null)throw new Error();
  76. return baos;
  77. }
  78.  
  79. @Override
  80. public Reader openReader(boolean ignoreEncodingErrors) throws IOException {
  81. throw new Error();
  82. }
  83.  
  84. @Override
  85. public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException {
  86. System.out.println("getCharContent");
  87. return src;
  88. }
  89.  
  90. @Override
  91. public Writer openWriter() throws IOException {
  92. throw new Error();
  93. }
  94.  
  95. @Override
  96. public long getLastModified() {
  97. throw new Error();
  98. }
  99.  
  100. @Override
  101. public boolean delete() {
  102. throw new Error();
  103. }
  104.  
  105. @Override
  106. public Kind getKind() {
  107. System.out.println("getKind");
  108. return Kind.SOURCE;
  109. }
  110.  
  111. @Override
  112. public boolean isNameCompatible(String simpleName, Kind kind) {
  113. System.out.println("isNameCompatible "+name+" ? "+simpleName);
  114. return name.equals(simpleName);
  115. }
  116.  
  117. @Override
  118. public NestingKind getNestingKind() {
  119. throw new Error();
  120. }
  121.  
  122. @Override
  123. public Modifier getAccessLevel() {
  124. throw new Error();
  125. }
  126.  
  127. }
  128.  
  129. static class JFM implements JavaFileManager {
  130. final JavaFileManager jfm;
  131. final Map<String, JFO> files;
  132. JFM(JavaFileManager jfm, Map<String, JFO> files){
  133. this.jfm=jfm;
  134. this.files=files;
  135. }
  136.  
  137. @Override
  138. public int isSupportedOption(String option) {
  139. int iso=jfm.isSupportedOption(option);
  140. System.out.println("isSupportedOption "+option+" "+iso);
  141. return iso;
  142. }
  143.  
  144. @Override
  145. public ClassLoader getClassLoader(Location location) {
  146. ClassLoader cl=jfm.getClassLoader(location);
  147. System.out.println("getClassLoader "+location+" "+cl);
  148. return cl;
  149. }
  150.  
  151. @Override
  152. public Iterable<JavaFileObject> list(Location location, String packageName, Set<Kind> kinds, boolean recurse)
  153. throws IOException {
  154. System.out.println("list "+location+" "+packageName+" ... "+recurse);
  155. return jfm.list(location, packageName, kinds, recurse);
  156. }
  157.  
  158. @Override
  159. public String inferBinaryName(Location location, JavaFileObject file) {
  160. String ibm=jfm.inferBinaryName(location, file);
  161. // System.out.println("inferBinaryName "+location+" "+file+" "+ibm);
  162. return ibm;
  163. }
  164.  
  165. @Override
  166. public boolean isSameFile(FileObject a, FileObject b) {
  167. throw new Error();
  168. }
  169.  
  170. @Override
  171. public boolean handleOption(String current, Iterator<String> remaining) {
  172. boolean ho=jfm.handleOption(current, remaining);
  173. System.out.println("handleOption "+current+" ...");
  174. return ho;
  175. }
  176.  
  177. @Override
  178. public boolean hasLocation(Location location) {
  179. boolean hl=jfm.hasLocation(location);
  180. // System.out.println("hasLocation "+location+" "+hl);
  181. return hl;
  182. }
  183.  
  184. @Override
  185. public JavaFileObject getJavaFileForInput(Location location, String className, Kind kind) throws IOException {
  186. // System.out.println("getJavaFileForInput "+location+" "+className+" "+kind.name());
  187. return jfm.getJavaFileForInput(location, className, kind);
  188. }
  189.  
  190. @Override
  191. public JavaFileObject getJavaFileForOutput(Location location, String className, Kind kind, FileObject sibling)
  192. throws IOException {
  193. System.out.println("getJavaFileForOutput "+location+" "+className+" "+kind.name()+" "+sibling);
  194. if(files.containsKey(className))
  195. throw new Error();
  196. JFO jfo=new JFO(className,null);
  197. files.put(className, jfo);
  198. return jfo;
  199. }
  200.  
  201. @Override
  202. public FileObject getFileForInput(Location location, String packageName, String relativeName)
  203. throws IOException {
  204. throw new Error();
  205. }
  206.  
  207. @Override
  208. public FileObject getFileForOutput(Location location, String packageName, String relativeName,
  209. FileObject sibling) throws IOException {
  210. throw new Error();
  211. }
  212.  
  213. @Override
  214. public void flush() throws IOException {
  215. System.out.println("flush");
  216. }
  217.  
  218. @Override
  219. public void close() throws IOException {
  220. throw new Error();
  221. }
  222.  
  223. public Location getLocationForModule(Location location, String moduleName) throws IOException {
  224. }
  225.  
  226. public Location getLocationForModule(Location location, JavaFileObject fo) throws IOException {
  227. }
  228.  
  229. public <S> ServiceLoader<S> getServiceLoader(Location location, Class<S> service) throws IOException {
  230. }
  231.  
  232. public String inferModuleName(Location location) throws IOException {
  233. String imm=jfm.inferModuleName(location);
  234. // System.out.println("inferModuleName "+location+" "+imm);
  235. return imm;
  236. }
  237.  
  238. public Iterable<Set<Location>> listLocationsForModules(Location location) throws IOException {
  239. Iterable<Set<Location>> llfm=jfm.listLocationsForModules(location);
  240. System.out.println("listLocationsForModules "+location+" ...");
  241. return llfm;
  242. }
  243.  
  244. public boolean contains(Location location, FileObject fo) throws IOException {
  245. }
  246. }
  247.  
  248. static class CL extends ClassLoader {
  249. public Class<?> defineClass(String name,byte array[]) {
  250. return defineClass(name, array, 0, array.length);
  251. }
  252. }
  253. }
  254.  
Success #stdin #stdout 1.24s 83072KB
stdin
Standard input is empty
stdout
public class Test {
  public static void main(String[] args) {
    System.out.println("Hello "+args[0]+"!");
  }
}
getKind
isSupportedOption --multi-release 1
handleOption --multi-release ...
getClassLoader CLASS_PATH java.net.URLClassLoader@4439f31e
getCharContent
isNameCompatible Test ? module-info
isNameCompatible Test ? module-info
listLocationsForModules MODULE_SOURCE_PATH ...
listLocationsForModules UPGRADE_MODULE_PATH ...
listLocationsForModules SYSTEM_MODULES ...
listLocationsForModules MODULE_PATH ...
isNameCompatible Test ? package-info
isNameCompatible Test ? module-info
list CLASS_PATH  ... false
isNameCompatible Test ? Test
list SYSTEM_MODULES[java.base] java.lang ... false
list SYSTEM_MODULES[java.base] java.lang.invoke ... false
list SYSTEM_MODULES[java.base] java.lang.annotation ... false
list SYSTEM_MODULES[java.base] java.io ... false
list SYSTEM_MODULES[java.base] java.lang.constant ... false
getJavaFileForOutput CLASS_OUTPUT Test CLASS Ideone$JFO@453da22c
openOutputStream
toUri Test
flush
flush
true
Hello StackOverflow!