Java动态编译一个简单的例子(我转载的,但是经过修定,可以在Eclipse下运行)
先不说别的,在Eclipse下运行的代码如下
代码
package com.test;
import java.io.*;
import java.lang.reflect.*;
import java.io.File;
/**
* @author DiZhuang com.test CompileTest.java */
public class CompileTest {
static com.sun.tools.javac.Main javac = new com.sun.tools.javac.Main();
@SuppressWarnings("static-access")
public static void main(String[] args) {
System.out.println("User Dir is " + System.getProperty("user.dir")
+ "\\src\\com\\test");
try {
File file = File.createTempFile("RunTime", ".java", new File(System
.getProperty("user.dir")
+ "\\src\\com\\test"));
String filename = file.getName();
System.out.println("tempFile name is " + filename);
String classname = filename.substring(0, filename.indexOf('.'));
System.out.println("class name is " + classname);
PrintWriter out = new PrintWriter(new FileOutputStream(file));
out.println("package com.test;");
out.println("public class " + classname + "{");
out.println("public static void main(String[] args){");
out.println("System.out.println(\"Yes!\");");
out.println("}}");
out.flush();
out.close();
String[] arg = new String[] { "-d",
System.getProperty("user.dir") + "\\bin",
System.getProperty("user.dir") + "\\src\\com\\test\\"
+ filename };
int status = javac.compile(arg);
System.out.println("compile status is " + status);
Class<?> cls = Class.forName("com.test."+classname);
Method main = cls.getMethod("main", new Class[] { String[].class });
main.invoke(null, new Object[] { new String[0] });
} catch (Exception e) {
e.printStackTrace();
}
}
}
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package com.test;
import java.io.*;
import java.lang.reflect.*;
import java.io.File;
/**
* @author DiZhuang com.test CompileTest.java */
public class CompileTest {
static com.sun.tools.javac.Main javac = new com.sun.tools.javac.Main();
@SuppressWarnings("static-access")
public static void main(String[] args) {
System.out.println("User Dir is " + System.getProperty("user.dir")
+ "\\src\\com\\test");
try {
File file = File.createTempFile("RunTime", ".java", new File(System
.getProperty("user.dir")
+ "\\src\\com\\test"));
String filename = file.getName();
System.out.println("tempFile name is " + filename);
String classname = filename.substring(0, filename.indexOf('.'));
System.out.println("class name is " + classname);
PrintWriter out = new PrintWriter(new FileOutputStream(file));
out.println("package com.test;");
out.println("public class " + classname + "{");
out.println("public static void main(String[] args){");
out.println("System.out.println(\"Yes!\");");
out.println("}}");
out.flush();
out.close();
String[] arg = new String[] { "-d",
System.getProperty("user.dir") + "\\bin",
System.getProperty("user.dir") + "\\src\\com\\test\\"
+ filename };
int status = javac.compile(arg);
System.out.println("compile status is " + status);
Class<?> cls = Class.forName("com.test."+classname);
Method main = cls.getMethod("main", new Class[] { String[].class });
main.invoke(null, new Object[] { new String[0] });
} catch (Exception e) {
e.printStackTrace();
}
}
}
按照网上的例子改写了一下,出现问题如下:
1 说找不到com.sun.tools.javac.Main ,主要是在Eclipse下加载了自己的JRE吧,我是这么认为的,解决办法:将别的JDK下面的tools.jar装入Eclipse类路径下(个人认为这是我们写test程序最省事的办法)
2 Eclipse下编译后的代码在bin文件夹下面,并且一般都有包名,所以编译和运行时候,千万别忘记路径,注意:这个我们在JDK下运行是不一样。
修改如下:
String[] arg = new String[] { "-d",
System.getProperty("user.dir") + "\\bin",
System.getProperty("user.dir") + "\\src\\com\\test\\"
+ filename };
-d 指明编译后类的存放位置
Class<?> cls = Class.forName("com.test."+classname);
指明类名