熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Java進階:SE6調用編譯器的兩種方法[2]

2013-11-23 19:39:05  來源: Java核心技術 

  三從內存中編譯

  JavaCompiler不僅可以編譯硬盤上的Java文件而且還可以編譯內存中的Java代碼然後使用reflection來運行它們我們可以編寫一個JavaSourceFromString類通過這個類可以輸入Java源代碼一但建立這個對象你可以向其中輸入任意的Java代碼然後編譯和運行而且無需向硬盤上寫class文件

  import javalangreflect*;
  import javaio*;
  import javaxtools*;
  import javaxtoolsJavaCompilerCompilationTask;
  import javautil*;
  import javanet*;
  public class test_compilerapi
  {
   private static void compilerJava() throws Exception
   {
    JavaCompiler compiler = ToolProvidergetSystemJavaCompiler();
    DiagnosticCollector diagnostics = new DiagnosticCollector();
    // 定義一個StringWriter類用於寫Java程序
    StringWriter writer = new StringWriter();
    PrintWriter out = new PrintWriter(writer);
    // 開始寫Java程序
    outprintln(public class HelloWorld {);
    outprintln( public static void main(String args[]) {);
    outprintln( Systemoutprintln(\Hello World\););
    outprintln( });
    outprintln(});
    outclose();
    //為這段代碼取個名子HelloWorld以便以後使用reflection調用
    JavaFileObject file = new JavaSourceFromString(HelloWorld writertoString());
    Iterable compilationUnits = ArraysasList(file);
    JavaCompilerCompilationTask task = compilergetTask(null null
    diagnostics null null compilationUnits);
    boolean success = taskcall();
    Systemoutprintln(Success: + success);
    // 如果成功通過reflection執行這段Java程序
    if (success)
    {
     Systemoutprintln(輸出);
     ClassforName(HelloWorld)getDeclaredMethod(main new Class[]
     { String[]class })invoke(null new Object[]
      { null });
       Systemoutprintln(輸出 );
      }
     }
     public static void main(String args[]) throws Exception
     {
      compilerJava();
     }
    }
    // 用於傳遞源程序的JavaSourceFromString類
    class JavaSourceFromString extends SimpleJavaFileObject
    {
     final String code;
     JavaSourceFromString(String name String code)
     {
      super(URIcreate(string:/// + namereplace( /)+ KindSOURCEextension) KindSOURCE);
      thiscode = code;
     }
     @Override
     public CharSequence getCharContent(boolean ignoreEncodingErrors)
    {
     return code;
    }
   }

[]  []  


From:http://tw.wingwit.com/Article/program/Java/hx/201311/27240.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.