日期:2014-05-20 浏览次数:21037 次
package com.saturday.asm;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.lang.reflect.Method;
public class MyClassEditor {
public static void main(String[] args){
File f=new File("d:/MyClass.java");
BufferedWriter writer;
try{
if(!f.exists()) f.createNewFile();
writer=new BufferedWriter(new FileWriter(f));
//重写类方法
writer.write("package com.saturday.asm;\n");
writer.write("public class MyClass extends MyClassEditor{\n");
writer.write("public void test(){\n");
writer.write("System.out.println(\"hello world! random="+Math.random()+"\");\n");
writer.write("}\n");
writer.write("}\n");
writer.close();
//编译类
Runtime run=Runtime.getRuntime();
run.exec("javac MyClass.java");
//执行类
Class cls;
int i=1;
//扫描直至类被编译完毕,可能有更好的方法来实现
//我对多线程什么的不懂只会这样做
while(true){
try{
cls=Class.forName("com.saturday.asm.MyClass");
break;
}catch (Exception e) {
System.out.println("第"+(i++)+"次加载失败!");
}
//休眠时间的长短视机器性能而定,我的机器慢定的长一些
Thread.sleep(200);
}
Object clsIns=cls.newInstance();
Method method=cls.getMethod("test",null);
method.invoke(clsIns,null);
}catch(Exception ex){
ex.printStackTrace();
}
}
public void test(){
}
}
------解决方案--------------------
编译可以不使用外部命令的调用,另外一种思路,引入jdk lib/tools.jar中的com.sun.tools.javac.Main类,
使用Main.compile(String[] filePathArray)对类进行编译,这样似乎更加完美一些。