java调用编译器_Java进阶:SE6调用编译器的两种方法[2]

Java进阶:SE6调用编译器的两种方法[2]以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

784495cd6cb3eaffc42da62fe6ef664b.png

三 从内存中编译

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值