//编译器类只有jdk6里面才有
public class CompilerTest {
//window下面的换行是\r\t 回车换行
public static void main(String[] args) throws IOException, ClassNotFoundException, Exception {
//得到系统当前的路径,即是java工程的路径(E:\workspace\base)
System.out.println(System.getProperty("user.dir"));
//在程序里对java文件进行编译,也应该就是动态编译了
writejavaFile();
//得到系统当前的java编译器,也就是javac
JavaCompiler javac=ToolProvider.getSystemJavaCompiler();
//不能是jre的运行环境,因为这个是纯净版本,不包含javac等,需要使用jdk才行,否则会是null
//先得到一个文件管理对象
//该对象的第一个参数是诊断监听器,
StandardJavaFileManager javafile=javac.getStandardFileManager(null, null, null);
String filename="D:/JavaTest.java";
//编译单元,可以有多个
Iterable units=javafile.getJavaFileObjects(filename);
//编译任务
CompilationTask t=javac.getTask(null, javafile, null, null, null, units);
t.call();
javafile.close();
把刚才在D:/下生成的class文件JavaTest.class加载进内存并生成实例对象
URL[] urls=new URL[]{new URL("file:/d:/")};
URLClassLoader classload=new URLClassLoader(urls);
Class clazz=classload.loadClass("JavaTest");
Method method=clazz.getMethod("main", String[].class);
//注意,调用Method类的方法invoke(Object,Object), main方法是类Run的静态方法,调用时是不需要对象实例的。
//Java中通过反射调用其他类中的main方法时要注意的问题
//http://www.cnblogs.com/duancanmeng/archive/2012/04/14/2524614.html
method.invoke(clazz.newInstance(),(Object)new String[]{});
}
//创建java文件
public static void writejavaFile() throws IOException{
File file=new File("D:/JavaTest.java");
if(!file.exists()){
file.createNewFile();
}
FileWriter fw=new FileWriter(file);
fw.write(javaClassContent());
fw.close();
}
//用字符串连接成一个java类
public static String javaClassContent(){
String rt="\r\n";
String java=new String();
java+="public class JavaTest{"+rt;
java+=" public static void main(String[] args){"+rt;
java+=" System.out.println(\"hello world\");"+rt;
java+=" show();"+rt;
java+=" }"+rt;
java+=" public static void show(){"+rt;
java+=" for(int i=0;i<4;i++){"+rt;
java+=" System.out.println(\"i=:\"+i);"+rt;
java+=" }"+rt;
java+=" }"+rt;
java+="}";
return java;
}
/**
* 运行结果:
* hello world
* i=:0
* i=:1
* i=:2
* i=:3
*/
}
用java调用编译器编译java文件-动态代理
最新推荐文章于 2024-06-30 03:26:26 发布