动态编译_DynamicCompile、反射调用main方法问题JAVA214

来源:互联网 发布:简繁体转换软件 编辑:程序博客网 时间:2024/05/18 01:22

来源:http://www.bjsxt.com/
一、S02E214_01动态编译_DynamicCompile、反射调用main方法问题

动态编译机制

通过JavaCompiler动态编译

通过Runtime和反射运行编译好的类

代码测试:

public class HelloWorld {    public static void main(String[] args){        System.out.println("Hi!!!!");    }}
package com.test.dynamicCompile;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.lang.reflect.Method;import java.net.URL;import java.net.URLClassLoader;import javax.tools.JavaCompiler;import javax.tools.ToolProvider;public class Demo {    public static void main(String[] args) throws IOException {        //1、通过JavaCompiler动态编译        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();        int result = compiler.run(null,null,null,"G:/JAVA/test/HelloWorld.java");        System.out.println(result==0?"编译成功":"编译失败");        //通过IO流操作,将字符串存储成一个临时文件,然后调用动态编译方法!        String str = "public class Hi { public static void main(String[] args){System.out.println(\"HAHA\");}}";        //此处省略一大段代码。。。        //2、通过Runtime.getRuntime()运行启动新的进程动态运行编译好的类        Runtime run = Runtime.getRuntime();        Process process = run.exec("java -cp g:/java/test HelloWorld");        InputStream in = process.getInputStream();        BufferedReader reader = new BufferedReader(new InputStreamReader(in));        String info = "";        while ((info=reader.readLine())!=null) {            System.out.println(info);        }        //3、通过反射运行编译好的类        try {            URL[] urls = new URL[] {new URL("file:/" + "g:/java/test/")};            URLClassLoader loader = new URLClassLoader(urls);            Class c = loader.loadClass("HelloWorld");            //调用加载类的main方法            Method m = c.getMethod("main", String[].class);            m.invoke(null, (Object)new String[]{});            //m.invoke(null, new String[]{"a","b"});            //上面代码会被编译成:m.invoke(null,"a","b"),这样就发生参数个数不匹配的问题            //因此,必须加上(Object)进行转型,避免这个问题        } catch (Exception e) {            e.printStackTrace();        }    }}

控制台输出

编译成功Hi!!!!Hi!!!!
0 0
原创粉丝点击