有兴趣的同行进来研究一下这种问题和解决方案 源程序出自http://www.chinajavaworld.net,具体位置我也不记的了,有兴赽的可以去看看。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你想讨论的是什么?这程序被你弄得乱糟糟的,呵呵String[] args = new String[] {"-d", System.getProperty("user.dir"), filename};这里不用file.getAbsolutePath()而使用filename是可以的么?我做过一个简单的动态生成运行java程序的东东,记得好像要写全路径才行,要不可能是大家环境不一样也说不定。你贴的这段代码能不能不能运行的?不太清楚你为什么要改,改过以后还没有原来那段代码好,呵呵 哈哈,的确是这样的。我发个原版的,不过就没讨论的价值了,呵呵。不过可以给人灵感.就写全路径问题的确很让人烦,如果写成实际路径后,软件就提上可移植的,以上程序的本来用意是实时的生成一段JAVA代码来运行,而我认为实时生的代码太过于死板,没有一定的灵活性,所以我屏蔽了那一段死代码,而使用一个java文件,该文件可以是程序实际生成的,也可以是现成的,不过路径问题一直没有解决,user.dir我设置成我当前的包了,可还是指向我开发程序的安装路径,我想这不会是我的IDE有问题吧,这是第一次尝试所以不大清楚只好贴上来了。上面的程序是可以运行的。 以下是原来的程序,/**/注释部份就是我想调用的一个测试文件-----------------------------------------------------------------package com.yadosoft.java;import java.io.File;import java.io.FileOutputStream;import java.io.PrintWriter;import java.lang.reflect.Method;import com.sun.tools.javac.Main;/*** 动态执行JAVA示例* Create on 2003/04/21* 调用方法: java ExecJava 要执行的JAVA语句,例如:java ExecJava System.out.println("123");* @author memphis.guo(email:[email protected])*/public class ExecJava{ public static void runJava(String code) { File file; Main javac = new Main(); String classname = ""; String filename = ""; try { /*这里-> *file = new File("d:\\MyProject\\TEST\\com\\yadosoft\\main\\Test.java"); System.out.println(file.getAbsolutePath());*/ //在当前目录下产生一个临时JAVA文件 file = File.createTempFile( "JavaRuntime", ".java", new File(System.getProperty("user.dir"))); //当程序离开时删除这个临时文件 file.deleteOnExit(); filename = file.getName(); classname = getClassName(filename); System.out.println("classname="+classname); //写临时文件 PrintWriter out = new PrintWriter(new FileOutputStream(file)); out.println("package com.yadosoft.main;\r\n"); out.println("import javax.swing.JFrame;\r\n"); out.println("public class " + classname + " extends javax.swing.JFrame\r\n{"); out.println("\tpublic static void main(String argc[])\r\n\t{"); out.println("\t\tnew " + classname + "().show();\r\n"); out.println("\t}\r\n}"); out.flush(); out.close(); //编译执行临时文件 System.out.println("user.dir="+System.getProperty("user.dir")); String[] args = new String[] {"-d", System.getProperty("user.dir"), filename}; int status = javac.compile(args); new File(file.getParent(), classname + ".class").deleteOnExit(); Class cls = Class.forName("com.yadosoft.main."+classname); Method main = cls.getMethod("main", new Class[] { String[].class }); main.invoke(null, new Object[] { new String[0] }); } catch (Exception e) { e.printStackTrace(); } } /**根据一个java源文件名获得类名*/ private static String getClassName(String filename) { return filename.substring(0, filename.lastIndexOf(".")); } public static void main(String args[]) { runJava(args[0]); }} TO bluesmile979(笑着):"这里不用file.getAbsolutePath()而使用filename是可以的么",getAbsolutePath()是得到文件的全路径,而filename只是一个文件名而以没有全路径 有人有通过WIFI上网的例子吗?(J2ME) 请帮我看一下这段代码谢谢了 java socket程序,文件传输后损坏!!! JavaScript中的匿名函数 用 ?: 操作符,获得a、b、c三个数中最大的那个? 初学 问个关于Java Applet 的问题 谢谢! help:ArrayList.get(i)转换成int型的问题 是Hibernate的缓存在搞鬼吗? 如何处理java.lang.UnsatisfiedLinkError? 怎样去掉乱码? 问一个如何配置服务器,能够显示出Applet 新手提问:jbuilder问题!
new String[] {"-d", System.getProperty("user.dir"), filename};这里不用file.getAbsolutePath()而使用filename是可以的么?我做过一个简单的动态生成运行java程序的东东,记得好像要写全路径才行,要不可能是大家环境不一样也说不定。你贴的这段代码能不能不能运行的?不太清楚你为什么要改,改过以后还没有原来那段代码好,呵呵
就写全路径问题的确很让人烦,如果写成实际路径后,软件就提上可移植的,以上程序的本来用意是实时的生成一段JAVA代码来运行,而我认为实时生的代码太过于死板,没有一定的灵活性,所以我屏蔽了那一段死代码,而使用一个java文件,该文件可以是程序实际生成的,也可以是现成的,不过路径问题一直没有解决,user.dir我设置成我当前的包了,可还是指向我开发程序的安装路径,我想这不会是我的IDE有问题吧,这是第一次尝试所以不大清楚只好贴上来了。
上面的程序是可以运行的。
-----------------------------------------------------------------
package com.yadosoft.java;import java.io.File;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.lang.reflect.Method;
import com.sun.tools.javac.Main;/**
* 动态执行JAVA示例
* Create on 2003/04/21
* 调用方法: java ExecJava 要执行的JAVA语句,例如:java ExecJava System.out.println("123");
* @author memphis.guo(email:[email protected])
*/public class ExecJava
{
public static void runJava(String code)
{
File file;
Main javac = new Main();
String classname = "";
String filename = "";
try
{
/*这里->
*file = new File("d:\\MyProject\\TEST\\com\\yadosoft\\main\\Test.java");
System.out.println(file.getAbsolutePath());*/
//在当前目录下产生一个临时JAVA文件
file = File.createTempFile(
"JavaRuntime",
".java",
new File(System.getProperty("user.dir")));
//当程序离开时删除这个临时文件
file.deleteOnExit();
filename = file.getName();
classname = getClassName(filename);
System.out.println("classname="+classname);
//写临时文件
PrintWriter out = new PrintWriter(new FileOutputStream(file));
out.println("package com.yadosoft.main;\r\n");
out.println("import javax.swing.JFrame;\r\n");
out.println("public class " + classname + " extends javax.swing.JFrame\r\n{");
out.println("\tpublic static void main(String argc[])\r\n\t{");
out.println("\t\tnew " + classname + "().show();\r\n");
out.println("\t}\r\n}");
out.flush();
out.close(); //编译执行临时文件
System.out.println("user.dir="+System.getProperty("user.dir"));
String[] args =
new String[] {"-d", System.getProperty("user.dir"), filename};
int status = javac.compile(args);
new File(file.getParent(), classname + ".class").deleteOnExit();
Class cls = Class.forName("com.yadosoft.main."+classname);
Method main = cls.getMethod("main", new Class[] { String[].class });
main.invoke(null, new Object[] { new String[0] });
}
catch (Exception e)
{
e.printStackTrace();
}
} /**根据一个java源文件名获得类名*/
private static String getClassName(String filename)
{
return filename.substring(0, filename.lastIndexOf("."));
} public static void main(String args[])
{
runJava(args[0]);
}
}