package com.lzy.test.bean;
import java.io.IOException;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import javax.tools.JavaCompiler;
import javax.tools.ToolProvider;
public class TestDemo01 {
public static void main(String[] args) throws IOException {
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
int result=compiler.run(null, null, null, "C:/myjava/HelloWrod.java");
System.out.println(result==0?"编译成功":"编译失败");
// //通过Runtime 调用执行类
// Runtime run=Runtime.getRuntime();
// Process process=run.exec("java -cp C:/myjava HelloWrod");
//
// InputStream in=process.getInputStream();
// BufferedReader reader=new BufferedReader(new InputStreamReader(in));
// String data="";
// while((data=reader.readLine())!=null) {
// System.out.println(data);
// }
try {
URL[]urls=new URL[] {new URL("file:/"+"C:/myjava/")};
URLClassLoader loader=new URLClassLoader(urls);
Class c=loader.loadClass("HelloWrod");
//调用加载类的main方法
Method m;
m = c.getMethod("main", String[].class);
m.invoke(null, (Object)new String[] {});
//由于可变参数是JDK5.0之后才有。
//m.invoke(null, (Object)new String[]{});会编译成:m.invoke(null,"aa","bb"),就发生了参数个数不匹配的问题。
//因此,必须要加上(Object)转型,避免这个问题。
//public static void main(String[] args)
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
代码中
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
int result=compiler.run(null, null, null, "C:/myjava/HelloWrod.java");
System.out.println(result==0?"编译成功":"编译失败");
第二行的四个参数:
第一个参数:为Java编译器提供参数(InputStream)输入流
use System.in if null
第二个参数:得到Java编译器的输出信息(Output Stream)输出流、
use System.out if null
第三个参数:接受编译器的错误信息(err)
use System.err if null
第四个参数:可变参数(是一个String数组)能传入Java源文件
返回值:0表示编译成功,非0表示编译失败
try {
URL[]urls=new URL[] {new URL("file:/"+"C:/myjava/")};
URLClassLoader loader=new URLClassLoader(urls);
Class c=loader.loadClass("HelloWrod");
//调用加载类的main方法
Method m;
m = c.getMethod("main", String[].class);
m.invoke(null, (Object)new String[] {});
//由于可变参数是JDK5.0之后才有。
//m.invoke(null, (Object)new String[]{});会编译成:m.invoke(null,"aa","bb"),就发生了参数个数不匹配的问题。
//因此,必须要加上(Object)转型,避免这个问题。
//public static void main(String[] args)
该段为通过反射调用main方法