编写高质量代码---慎用动态编译

慎用动态编译

动态编译一直是Java的梦想,从Java 6版本它开始支持动态编译了,可以在运行期直接编译.java文件,执行.class,并且能够获得相关的输入输出,甚至还能监听相关的事件。不过,我们 最期望的还是给定一段代码,直接编译,然后运行,也就是空中编译执行(on-the-fly),来看如下代码:

  1. public class Client {  
  2.      public static void main(String[] args) throws Exception {  
  3.          //Java源代码  
  4.          String sourceStr = "public class Hello{    public String sayHello (String name) {return \"Hello,\" + name + \"!\";}}";  
  5.          //类名及文件名  
  6.          String clsName = "Hello";  
  7.          //方法名  
  8.          String methodName = "sayHello";  
  9.          //当前编译器  
  10.          JavaCompiler cmp = ToolProvider.getSystemJavaCompiler();  
  11.          //Java标准文件管理器  
  12.          StandardJavaFileManager fm = cmp.getStandardFileManager(null,null,null);  
  13.          //Java文件对象  
  14.          JavaFileObject jfo = new StringJavaObject(clsName,sourceStr);  
  15.          //编译参数,类似于javac <</span>options>中的options  
  16.          List<</span>String> optionsList = new ArrayList<</span>String>();  
  17.          //编译文件的存放地方,注意:此处是为Eclipse工具特设的  
  18.          optionsList.addAll(Arrays.asList("-d","./bin"));  
  19.          //要编译的单元  
  20.          List<</span>JavaFileObject> jfos = Arrays.asList(jfo);  
  21.          //设置编译环境  
  22.          JavaCompiler.CompilationTask task = cmp.getTask(null, fm, null, optionsList,null,jfos);  
  23.          //编译成功  
  24.          if(task.call()){  
  25.              //生成对象  
  26.              Object obj = Class.forName(clsName).newInstance();  
  27.              Class

你可能感兴趣的:(java,动态编译)