我有一个应用程序将某些类检测为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。远程对象不实现原始对象实现的接口。这真的是这样,还是我错过了什么?
我在运行Yosemite的Mac book pro上使用JDK 1.8.0_31
答案 0 :(得分:0)
我正在创建一个实现java.mi.Remote接口的类,希望存根也能实现它。不这样做。远程对象必须至少实现一个远程扩展的接口。