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