java动态编译

来源:互联网 发布:法律人工智能十大趋势 编辑:程序博客网 时间:2024/06/06 20:02

public class Client {
                    public static void main(String[] args) throws Exception {
                    //Java 源代码
                    Stri ng sourceStr = "public class Hello{ public String sayHello (String name)
                                                  {return \"Hello,\" + name + \"!\";}}";
                    // 类名及文件名
                    String clsName = "Hello";
                    // 方法名
                   String methodName = "sayHello";
                    // 当前编译器
                    JavaCompiler cmp = ToolProvider.getSystemJavaCompiler();
                   //Java 标准文件管理器
                    StandardJavaFileManager fm = cmp.getStandardFileManager(null,null,null);
                   //Java 文件对象
                    JavaFileObject jfo = new StringJavaObject(clsName,sourceStr);
                   // 编译参数,类似于 javac <options> 中的 options
                    List<String> optionsList = new ArrayList<String>();
                   // 编译文件的存放地方,注意:此处是为 Eclipse 工具特设的
                    optionsList.addAll(Arrays.asList("-d","./bin"));
                   // 要编译的单元
                    List<JavaFileObject> jfos = Arrays.asList(jfo);
                   // 设置编译环境
                    Java Compiler.CompilationTask task = cmp.getTask(null, fm, null,
                    optionsList,null,jfos);
                   // 编译成功
                                if(task.call()){
                                 // 生成对象
                                 Object obj = Class.forName(clsName).newInstance();
                                 Class<? extends Object> cls = obj.getClass();
                                 // 调用 sayHello 方法
                                  Method m = cls.getMethod(methodName, String.class);
                                  String str = (String) m.invoke(obj, "Dynamic Compilation");
                                  System.out.println(str);
                                  }
                 }
}
// 文本中的 Java 对象
class StringJavaObject extends SimpleJavaFileObject{
               // 源代码
                private String content = "";
               // 遵循 Java 规范的类名及文件
                public StringJavaObject(String _javaFileName,String _content){
                                  super(_createStringJavaObjectUri(_javaFileName),Kind.SOURCE);
                                  content = _content;
                 }
               // 产生一个 URL 资源路径
                private static URI _createStringJavaObjectUri(String name){
               // 注意此处没有设置包名
                                  return URI.create("String:///" + name + Kind.SOURCE.extension);
                }
                // 文本文件代码
                @Override
                 public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException {
                                  return content;
                 }
}

原创粉丝点击