Java RMI 导出子class : class 转换异常
Java RMI export subclass : class cast exception
我有一个应用程序检测到某些 classes 是 RMI 可导出的,并导出它们。可导出的 classes 应该实现一个接口,该接口将出现在 RMI 客户端上以进行转换并使存根可用。
然后我执行以下代码(使用 CGLIB)导出 class :
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。原始对象实现的接口没有被远程对象实现。真的是这样吗,还是我漏了什么?
我正在 JDK 1.8.0_31 Mac pro 运行ning Yosemite
一本书上
我正在创建一个实现了 java.mi.Remote 接口的 class,希望存根也能实现它。那样不行。远程对象必须至少实现一个扩展远程的接口。
我有一个应用程序检测到某些 classes 是 RMI 可导出的,并导出它们。可导出的 classes 应该实现一个接口,该接口将出现在 RMI 客户端上以进行转换并使存根可用。 然后我执行以下代码(使用 CGLIB)导出 class :
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。原始对象实现的接口没有被远程对象实现。真的是这样吗,还是我漏了什么?
我正在 JDK 1.8.0_31 Mac pro 运行ning Yosemite
一本书上我正在创建一个实现了 java.mi.Remote 接口的 class,希望存根也能实现它。那样不行。远程对象必须至少实现一个扩展远程的接口。