知识大全 SE6调用编译器的两种方法[2]

Posted

篇首语:但使书种多,会有岁稔时。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 SE6调用编译器的两种方法[2]相关的知识,希望对你有一定的参考价值。

Java进阶:SE6调用编译器的两种方法[2]  以下文字资料是由(全榜网网www.cha138.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;      

cha138/Article/program/Java/hx/201311/27240

相关参考