首先,请看JavaCompiler
API。基本上:
- 在字符串中创建Java类。
- 将字符串放入扩展SimpleJavaFileObject的类中。
- 使用
JavaCompiler
实例进行编译。
最后,将方法称为新类。
这是与JDK6
+一起使用的示例:
import java.io.IOException;import java.io.PrintWriter;import java.io.StringWriter;import java.lang.reflect.InvocationTargetException;import java.net.URI;import java.util.Arrays;import javax.tools.Diagnostic;import javax.tools.DiagnosticCollector;import javax.tools.JavaCompiler;import javax.tools.JavaFileObject;import javax.tools.SimpleJavaFileObject;import javax.tools.ToolProvider;import javax.tools.JavaCompiler.CompilationTask;import javax.tools.JavaFileObject.Kind;public class CompileSourceInMemory { 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 { Class.forName("HelloWorld").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 pre; JavaSourceFromString(String name, String pre) { super(URI.create("string:///" + name.replace('.','/') + Kind.SOURCE.extension),Kind.SOURCE); this.pre = pre; } @Override public CharSequence getCharContent(boolean ignoreEncodingErrors) { return pre; }}


