日志文章

2020-1-2 aflfte2011

动态编译

package com.aflfte.test;

import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;

import javax.tools.JavaCompiler;
import javax.tools.ToolProvider;
/**
 * 动态编译
 * 通过Runtime.getRuntime()进行动态运行编译好的类
 *
 * @author root
 *
 */
public class Demo01 {
    public static void main(String[] args) throws Exception {
        JavaCompiler com=ToolProvider.getSystemJavaCompiler();
        int r=com.run(null, null, null, "/root/文档/HelloWord.java");
        System.out.println(r==0?"is OK":"Error");
        //通过Runtime.getRuntime()进行动态运行编译好的类
        /**Runtime run=Runtime.getRuntime();
        Process pr=run.exec("java -cp /root/文档 HelloWord");
        InputStream in=pr.getInputStream();
        BufferedReader reader=new BufferedReader(new InputStreamReader(in));
        String info="";
        while((info=reader.readLine())!=null) {
            System.out.println(info);
        }*/
        //通过反射动态加载类
        URL[] urls=new URL[] {new URL("file:/"+"root/文档/")};
        URLClassLoader loader=new URLClassLoader(urls);
        Class c=loader.loadClass("HelloWord");
        //调用加载类的main方法
        Method m=c.getMethod("main", String[].class);
        //Object强转型不加分被编译成m.invoke(null,"aa","bb"}出现参数个数不配问题
        m.invoke(null,(Object)new String[] {});
        
        
    }
}

« 测试脚本引擎执行javascript代码 | 通过反射获取泛型信息»