请问如何利用当前运行的一个java程序去执行另外一个java程序
我的意思是这样的,一个java程序正在运行,比如其源代码为
public class running{
public static void main(string[] args){
System.out.println("helloworld");
////////////////////////////////在此行调入waiting程序并且编译,动态运行
}
}
我另外有一个程序,存在硬盘中,是.java文件,该程序若如下
public class waitting{
public static void main(string[] args){
System.out.println("how are you ");
}
}
如何达到运行running的时候又编译而且运行waiting
[解决办法]
这个问题貌似我以前又答过!!如果你能看得明白我以前修改过这个例子,你就明白了!!!!!
import java.io.DataInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
/**
* @author Every E-mail/MSN:mwgjkf@hotmail.com
* QQ:30130942
* @version 创建时间:Dec 30, 2008 3:34:57 PM
* 类说明:
*
*/
public class RuntimeCode{
/**编译器*/
private static com.sun.tools.javac.Main javac=new com.sun.tools.javac.Main();
/**等待用户输入JavaCode,然后编译、执行*/
public static void main(String[] args) throws Exception{
String code = "";
DataInputStream bd = new DataInputStream(System.in);
byte[] brray= new byte[200];
int i = bd.read(brray);
code = new String(brray,0,i);
run(compile(code));
System.out.println(code);
}
/**编译JavaCode,返回临时文件对象*/
private synchronized static File compile(String code)throws IOException,Exception{
File file;
//在用户当前文件目录创建一个临时代码文件
file=File.createTempFile("JavaCode",".java",new File(System.getProperty("user.dir")));
//当虚拟机退出时,删除此临时java源文件
file.deleteOnExit();
//获得文件名和类名字
String filename=file.getName();
String classname=getClassName(filename);
System.out.println(classname);
//将代码输出到文件
PrintWriter out=new PrintWriter(new FileOutputStream(file));
out.write("public class "+classname+"{"+"public static void main(String []agrs) "+"{");
out.write(code);
out.write("}}");
//关闭文件流
out.flush();
out.close();
//编译代码文件
String[] args=new String[]{"-d",System.getProperty("user.dir"),filename};
System.out.println("user.dir-------->"+System.getProperty("user.dir"));
//返回编译的状态代码
int status=javac.compile(args);
//处理编译状态
System.out.println(status);
return file;
}
public void main(){
}
/**执行刚刚编译的类文件*/
private static synchronized void run(File file){
//当虚拟机退出时,删除此临时编译的类文件
//获得文件名和类名字
String filename = file.getName();
String classname = getClassName(filename);
System.out.println("filename-------->"+filename);
System.out.println("classname----"+classname);
new File(file.getParent(),classname+".class").deleteOnExit();
try {
// 访问这个类
//Class cls = Class.forName(classname);
URL url = new URL("file:/"+System.getProperty("user.dir")+""+File.separator);
URLClassLoader urlClass = new URLClassLoader(new URL[]{url});
Class cls = urlClass.loadClass(classname);
Object obj = cls.newInstance();
System.out.println("obj==========="+obj);
//调用main方法
Method main = cls.getMethod("main", new Class[] {String[].class });
main.invoke(obj, new Object[] {new String[]{} });
}catch (SecurityException se) {
debug("access to the information is denied:" + se.toString());
}catch (NoSuchMethodException nme) {
debug("a matching method is not found or if then name is or : " + nme.toString());
}catch (InvocationTargetException ite) {
debug("Exception in main: " + ite.getTargetException());
}catch (Exception e){
debug(e.toString());
e.printStackTrace();
}
}
/**打印调试信息*/
private static void debug(String msg){
System.err.println(msg);
}
/**根据一个java源文件名获得类名*/
private static String getClassName(String filename){
return filename.substring(0,filename.length()-5);
}
}
动态编译用:com.sun.tools.javac.Main javac这个类!
动态加载不在classPath的类用:URLClassLoader这个类,class.forName个人认为只能加载在CLASSPATH的类!!
动态运行JAVA类用JAVA反射机制!!!!
以上都有,慢慢消化!!!!!!!