日期:2014-05-20 浏览次数:20761 次
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)对类进行编译,这样似乎更加完美一些。