import javax.tools.JavaCompiler;
import javax.tools.ToolProvider;
import java.io.*;
public class Demo01 {
public static void main(String[] args) throws IOException {
String string="" +
"public class Hi{" +
" public static void main(String[] args){ System.out.println(\"很爱很爱你\");}}";
OutputStream os= null;
try {
os = new FileOutputStream(new File("D:/t/Hi.java"));
byte[] data=string.getBytes();
os.write(data,0,data.length);
os.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
JavaCompiler compiler= ToolProvider.getSystemJavaCompiler();
int result=compiler.run(null,null, null, "D:/t/Test.java","D:/t/Hi.java");
System.out.println(result==0?"编译成功":"编译失败");
//动态运行
Runtime runtime=Runtime.getRuntime();
Process process=runtime.exec("java -cp D:/t Test");
//通过流将运行结果传过来
InputStream is=process.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(is));
String info="";
while (null!=(info=br.readLine())){
System.out.println(info);
}
//通过反射动态编译
try {
URL[] urls=new URL[]{new URL("file:/"+"D:/t/")};
URLClassLoader classLoader=new URLClassLoader(urls);
Class c=classLoader.loadClass("Hi");
Method m=c.getMethod("main",String[].class);
m.invoke(null,(Object)new String[]{});
//m.invoke(null,new String[]{"aa","bb"});
//由于可变参数时JDK5.0之后才有,上面代码会编译成m.invoke(null,"aa","bb"),就发生了参数个数不匹配的问题
//因此,必须加上(Object)转型
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}