content: import javax.tools.Diagnostic;
  import javax.tools.DiagnosticCollector;
  import javax.tools.JavaCompiler;
  import javax.tools.JavaCompiler.CompilationTask;
  import javax.tools.JavaFileObject;
  import javax.tools.SimpleJavaFileObject;
  import javax.tools.ToolProvider;
  import java.io.File;
  import java.io.IOException;
  import java.io.PrintWriter;
  import java.io.StringWriter;
  import java.lang.reflect.InvocationTargetException;
  import java.net.URI;
  import java.net.URL;
  import java.net.URLClassLoader;
  import java.util.Arrays;
  
  
  public class Main {
    public static void main(String args[]) throws IOException {
      JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
      DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>();
  
      StringWriter writer = new StringWriter();
      PrintWriter out = new PrintWriter(writer);
      out.println("public class HelloWorld {");
      out.println("  public static void main(String args[]) {");
      out.println("    System.out.println(\"This is in another java file\");");    
      out.println("  }");
      out.println("}");
      out.close();
      JavaFileObject file = new JavaSourceFromString("HelloWorld", writer.toString());
  
      Iterable<? extends JavaFileObject> compilationUnits = Arrays.asList(file);
      CompilationTask task = compiler.getTask(null, null, diagnostics, null, null, compilationUnits);
  
      boolean success = task.call();
      for (Diagnostic diagnostic : diagnostics.getDiagnostics()) {
        System.out.println(diagnostic.getCode());
        System.out.println(diagnostic.getKind());
        System.out.println(diagnostic.getPosition());
        System.out.println(diagnostic.getStartPosition());
        System.out.println(diagnostic.getEndPosition());
        System.out.println(diagnostic.getSource());
        System.out.println(diagnostic.getMessage(null));
  
      }
      System.out.println("Success: " + success);
  
      if (success) {
        try {
  
            URLClassLoader classLoader = URLClassLoader.newInstance(new URL[] { new File("").toURI().toURL() });
            Class.forName("HelloWorld", true, classLoader).getDeclaredMethod("main", new Class[] { String[].class }).invoke(null, new Object[] { null });
  
        } catch (ClassNotFoundException e) {
          System.err.println("Class not found: " + e);
        } catch (NoSuchMethodException e) {
          System.err.println("No such method: " + e);
        } catch (IllegalAccessException e) {
          System.err.println("Illegal access: " + e);
        } catch (InvocationTargetException e) {
          System.err.println("Invocation target: " + e);
        }
      }
    }
  }
  
  class JavaSourceFromString extends SimpleJavaFileObject {
    final String code;
  
    JavaSourceFromString(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;
    }
  }
  