我有一个应用程序,它检测一些类是RMI可导出的,并导出它们。可导出类应该实现一个接口,该接口将出现在RMI客户端上,以执行强制转换并使存根可用。然后执行以下代码(使用CGLIB)导出类:
public void bind(Object objectInstance) {
try {
Enhancer classEnhancer = new Enhancer();
classEnhancer.setSuperclass(objectInstance.getClass());
classEnhancer.setInterfaces(new Class[]{Remote.class});
classEnhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
return methodProxy.invokeSuper(obj, args);
}
});
Object proxy = classEnhancer.create();
Remote stub =
(java.rmi.Remote)UnicastRemoteObject.exportObject((Remote)proxy, 0);
Registry registry = LocateRegistry.getRegistry();
registry.rebind("Object", stub);
System.out.println("object instance bound");
} catch (RemoteException e) {
System.out.print("error : " + e.getMessage());
e.printStackTrace();
} catch (Throwable t) {
t.printStackTrace();
}
}
当我运行应用程序并与RMI浏览器连接时,我可以看到存根实现的唯一接口是java.rmi.Remote。原始对象实现的接口不是由远程对象实现的。真的是这样吗,还是我漏掉了什么?
我在运行约塞米蒂的Mac图书上使用JDK 1.8.0_31。
发布于 2015-08-07 08:18:40
我创建了一个实现java.mi.Remote接口的类,希望存根也能实现它。不是这样的。远程对象必须实现至少一个扩展远程的接口。
https://stackoverflow.com/questions/31840991
复制