Java进阶:SE6调用编译器的两种方法[2]以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
三 从内存中编译
JavaCompiler不仅可以编译硬盘上的Java文件 而且还可以编译内存中的Java代码 然后使用reflection来运行它们 我们可以编写一个JavaSourceFromString类 通过这个类可以输入Java源代码 一但建立这个对象 你可以向其中输入任意的Java代码 然后编译和运行 而且无需向硬盘上写 class文件
import java lang reflect *; import java io *; import javax tools *; import javax tools JavaCompiler CompilationTask; import java util *; import java net *; public class test_pilerapi { private static void pilerJava() throws Exception { JavaCompiler piler = ToolProvider getSystemJavaCompiler(); DiagnosticCollector diagnostics = new DiagnosticCollector(); // 定义一个StringWriter类 用于写Java程序 StringWriter writer = new StringWriter(); PrintWriter out = new PrintWriter(writer); // 开始写Java程序 out println( public class HelloWorld { ); out println( public static void main(String args[]) { ); out println( System out println(\ Hello World\ ); ); out println( } ); out println( } ); out close(); //为这段代码取个名子 HelloWorld 以便以后使用reflection调用 JavaFileObject file = new JavaSourceFromString( HelloWorld writer toString()); Iterable pilationUnits = Arrays asList(file); JavaCompiler CompilationTask task = piler getTask(null null diagnostics null null pilationUnits); boolean success = task call(); System out println( Success: + success); // 如果成功 通过reflection执行这段Java程序 if (success) { System out println( 输出 ); Class forName( HelloWorld ) getDeclaredMethod( main new Class[] { String[] class }) invoke(null new Object[] { null }); System out println( 输出 ); } } public static void main(String args[]) throws Exception { pilerJava(); } } // 用于传递源程序的JavaSourceFromString类 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; } } lishixinzhi/Article/program/Java/hx/201311/27240
分页:123