本帖最后由 熊永标 于 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。 |