首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

请教怎么利用当前运行的一个java程序去执行另外一个java程序

2012-03-27 
请问如何利用当前运行的一个java程序去执行另外一个java程序我的意思是这样的,一个java程序正在运行,比如

请问如何利用当前运行的一个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反射机制!!!!
以上都有,慢慢消化!!!!!!!

热点排行
Bad Request.