怎么动态设置方法体
阅读
现在有一个方法,他的方法体是不确定的。方法体需要从一个文件中读取代码。
如何实现?
------解决方案--------------------
让他把方法按一定的脚本格式来写,这样你读他给你的文件然后交给脚本解释模块运行就可以了
jdk1.6已经有这方面的api了
------解决方案--------------------
1.用来修改的类文件:
package dynamicload;
public class Test
{
// 需要动态加载的方法
public void dyMethod()
{
}
public static void main(String[] args)
{
new Test().dyMethod();
}
}
------解决方案--------------------
mark
------解决方案--------------------
这个帖子很有意思,自己写了个。文件的路径被写死了,因为实在
不知道该如何定位文件,运行的时候把这个文件放到D盘根目录
在dos下编译
javac -d . *.java
java com.saturday.asm.MyClassEditor
此程序在xp jdk1.6下调试通过
- Java code
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)对类进行编译,这样似乎更加完美一些。阅读上一篇:Java线程中的局部变量 下一篇:返回列表