日期:2014-05-20  浏览次数:20761 次

如何动态设置方法体
现在有一个方法,他的方法体是不确定的。方法体需要从一个文件中读取代码。
如何实现?

------解决方案--------------------
让他把方法按一定的脚本格式来写,这样你读他给你的文件然后交给脚本解释模块运行就可以了
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)对类进行编译,这样似乎更加完美一些。