客户端是否必须拥有所有实现或只是接口?
详细说明:让我们拥有远程接口Foo:
public interface Foo extends Remote {
FooMessage getFooMessage () throws RemoteException;
void setFooMessage (FooMessage fm) throws RemoteException;
}
客户端和服务器之间的通信是通过FooMessage进行的。
public interface FooMessage {
String getMsg ();
void setMsg (String str);
}
客户端非常简单:
public void clientCode () {
Foo foo = (Foo)Naming.lookup ("rmi://localhost/FooService");
FooMessage msg = foo.getFooMessage ();
msg.setMsg ("asdf");
foo.setFooMessage (msg);
}
Foo和FooMessage都应该在服务器端具体实现。问题是:客户端是否也有这些实现,或者RMI机制是否隐式地转移实现?
答案 0 :(得分:1)
使用RMI类加载器的具体实现类can be loaded by the client from the server,。但是,要记住一个共同的“陷阱”:
SecurityManager
,否则将禁用RMI类加载器。这旨在限制提供给客户端的任何恶意代码的操作。file:
URL,http:
服务器等。这是使用java.rmi.server.codebase
系统属性指定的。(另请注意:链接指南很有用,但它讲的很多关于“存根”;自Java 5以来,最常见的是使用客户端在运行时动态生成的存根。该机制适用于任何其他类但是,需要分享。)