有一个C/S模型的实用,客户端需要执行一个经常变化的类,但类的名字和方法是固定的,客户端每次启动后,都从服务器下载编译好的CLASS文件如:A.CLASS,出于安全的考虑,这个文件不能存在文件系统中,只能保存在内存块中. 由于对于客户端业说,A.CLASS只能在运行时才出现,所以想采用反射技术,即:
Class objClass = Class.forName("A.CLASS");
A obj = (A)objClass.newInstance();
但好象要使该方法成功,A必须是客户端可以找得到的类,问题是现在A.CLASS 这个字节码还只是在内存块中.如何实现呢? 高分酬谢!!

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【yupengfei_110】截止到2008-07-09 14:05:48的历史汇总数据(不包括此帖):
    发帖的总数量:6                        发帖的总分数:200                      每贴平均分数:33                       
    回帖的总数量:24                       得分贴总数量:7                        回帖的得分率:29%                      
    结贴的总数量:6                        结贴的总分数:200                      
    无满意结贴数:0                        无满意结贴分:0                        
    未结的帖子数:0                        未结的总分数:0                        
    结贴的百分比:100.00%               结分的百分比:100.00%                  
    无满意结贴率:0.00  %               无满意结分率:0.00  %                  
    敬礼!
      

  2.   

    自己写个 ClassLoader 拿它加载你的 Class,再用反射 new 实例。
      

  3.   

    自己写个 ClassLoader 拿它加载你的 Class,再用反射 new 实例。谢谢,sagezk
    能否给出一个实例,这个我不太懂!
      

  4.   

    参考 JDK 文档中有关 ClassLoader 的部分。
      

  5.   

    自己编写一个ClassLoader类.用于将网络上传输的byte流,转换成对应的Class.
    由于,每次都要调用相同的方法,只是方法体不同,建议抽象出Interface,这样,就不必使用反射,只进行Interface的强制类型转换就可以了.
    比如:
    public class MyClassLoader extends ClassLoader{
         public Class loadClass(InputStream in)throws IOException{
              //添加函数体.读取in.得到byte[].然后好象有个defineClass方法,调用一下就可以了.
              //当然,这个方法最好只用于class A的加载.其他的类,要么系统自动加载,要么扩展该类的功能进行加载.
         }
    }public interface IA{//服务端,客户端都要有这个interface
         public Object call(Object args);//这个就是那个客户端经常要调用的方法
    }public class A implements IA{//这个class就是服务端要传给客户端的class
         public Object call(Object args){
              //添加方法体的内容.每次改变这里内容就可以了.
         }
    }//客户端的使用
    InputStream in = clientSocket.getInputStream();
    MyClassLoader loader = new MyClassLoader();
    Class ca = loader.loadClass(in);
    IA a = (IA)ca.newInstance();
    Object args = new Object();//该行表示你要调用方法的参数.
    Object result = a.call(args);//调用结果在result当中.