A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 熊永标 中级黑马   /  2013-4-11 11:56  /  1582 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 熊永标 于 2013-4-11 11:59 编辑

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.lang.reflect.Method;


public class DyiCompiler {

        /**
         * @param args
         * @throws IOException
         */
        public static void main(String[] args){
                // TODO Auto-generated method stub
                StringBuilder javaCode=new StringBuilder();
                javaCode.append("public class DyiCompilerTest{");
                        javaCode.append("public static void main(String[] args) {");
                                javaCode.append("System.out.println(\"hello!!!!!\");");
                        javaCode.append("}");
                javaCode.append("}");
                BufferedWriter bw;
                try {
                        bw = new BufferedWriter(new FileWriter(".\\bin\\DyiCompilerTest.java"));
                        bw.write(javaCode.toString());
                        bw.close();
                        //Process proc=new ProcessBuilder("javac",".\\bin\\DyiCompilerTest.java").start();
                        Runtime runtime=Runtime.getRuntime();
                        Process proc=runtime.exec("javac .\\bin\\DyiCompilerTest.java");
                        InputStream is=proc.getErrorStream();
                        InputStreamReader isr=new InputStreamReader(is);
                        BufferedReader br=new BufferedReader(isr);
                        String line=null;
                        while((line=br.readLine())!=null){
                                System.out.println(line);
                        }
                        Class clazz=Class.forName("DyiCompilerTest");
                        Object obj=clazz.newInstance();
                        Method m=clazz.getMethod("main", String[].class);
                        m.invoke(null, new String[1]);
                } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                        
                }
               
               
        }
}
动态编可以用于做一些运行时才能确定的工作,可以通过配置文件产生一个类文件,然后通过编译后,再进行反射后得到一个对象,然后执行其功能完成工作的需要。当我们的需求发生变化后,再修改配置文件,再重新生成类文件,重新编译执行。也可以说是二次开发的好选择.
但是动态编译要求客户机上必需有jdk,也可通过服务器远程方法调用,从而避免客户端安装jdk。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

1 个回复

倒序浏览
值得学习ing!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马