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

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

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

  通過JavaCompiler進行編譯都是在當前目錄下生成class文件而使用編譯選項可以改變這個默認目錄編譯選項是一個元素為String類型的Iterable集合如我們可以使用如下代碼在D盤根目錄下生成class文件

  Iterable options = ArraysasList(d d:\\);
  JavaCompilerCompilationTask task = compilergetTask(null fileManager
  diagnostics options null compilationUnits);

  在上面的例子中options處的參數為null而要傳遞編譯器的參數就需要將options傳入

  有時我們編譯一個Java源程序文件而這個源程序文件需要另幾個Java文件而這些Java文件又在另外一個目錄那麼這就需要為編譯器指定這些文件所在的目錄

  Iterable options = ArraysasList(sourcepath d:\\src);

  上面的代碼指定的被編譯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/27244.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.