Java RMI导出子类:类强制转换异常

时间:2015-08-05 19:15:55

标签: java rmi cglib

我有一个应用程序将某些类检测为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

1 个答案:

答案 0 :(得分:0)

我正在创建一个实现java.mi.Remote接口的类,希望存根也能实现它。不这样做。远程对象必须至少实现一个远程扩展的接口。