用java调用编译器编译java文件-动态代理

来源:互联网 发布:arm linux系统 编辑:程序博客网 时间:2024/05/19 20:43
//编译器类只有jdk6里面才有public class CompilerTest {//window下面的换行是\r\t 回车换行public static void main(String[] args) throws IOException, ClassNotFoundException, Exception {//得到系统当前的路径,即是java工程的路径(E:\workspace\base)System.out.println(System.getProperty("user.dir"));//在程序里对java文件进行编译,也应该就是动态编译了writejavaFile();//得到系统当前的java编译器,也就是javacJavaCompiler javac=ToolProvider.getSystemJavaCompiler();//不能是jre的运行环境,因为这个是纯净版本,不包含javac等,需要使用jdk才行,否则会是null//先得到一个文件管理对象//该对象的第一个参数是诊断监听器,StandardJavaFileManager javafile=javac.getStandardFileManager(null, null, null);String filename="D:/JavaTest.java";//编译单元,可以有多个Iterable units=javafile.getJavaFileObjects(filename);//编译任务CompilationTask t=javac.getTask(null, javafile, null, null, null, units);t.call();javafile.close();////把刚才在D:/下生成的class文件JavaTest.class加载进内存并生成实例对象URL[] urls=new URL[]{new URL("file:/d:/")};URLClassLoader classload=new URLClassLoader(urls);Class clazz=classload.loadClass("JavaTest");Method method=clazz.getMethod("main", String[].class);//注意,调用Method类的方法invoke(Object,Object), main方法是类Run的静态方法,调用时是不需要对象实例的。//Java中通过反射调用其他类中的main方法时要注意的问题//http://www.cnblogs.com/duancanmeng/archive/2012/04/14/2524614.htmlmethod.invoke(clazz.newInstance(),(Object)new String[]{});}//创建java文件public static void writejavaFile() throws IOException{File file=new File("D:/JavaTest.java");if(!file.exists()){file.createNewFile();}FileWriter fw=new FileWriter(file);fw.write(javaClassContent());fw.close();}//用字符串连接成一个java类public static String javaClassContent(){String rt="\r\n";String java=new String();java+="public class JavaTest{"+rt;java+=" public static void main(String[] args){"+rt;java+="System.out.println(\"hello world\");"+rt;java+="show();"+rt;java+="}"+rt;java+="public static void show(){"+rt;java+="for(int i=0;i<4;i++){"+rt;java+="System.out.println(\"i=:\"+i);"+rt;java+="}"+rt;java+="}"+rt;java+="}";return java;}/** * 运行结果: * hello world * i=:0 * i=:1 * i=:2 * i=:3 */}