我在代码中使用ICE。我想运行需要GameObserverPrx作为参数的函数。我不想按值传递GameObserver,我在切片界面中使用GameObserver *来传递代理。
我应该使用什么功能将GameObserver投射到GameObserverPrx? 第二个问题 - 为什么ICE coudn不是我做的? 我在网上搜索答案。我只找到了ObjectAdapter.checkedCast,但它可以用于其他目的。
这是错误:
方法中的addObserver(String,GameObserverPrx,Current)方法 GameProxyImpl不适用于参数(String, GameObserverImpl, null)PrzeciwnikKomputerowy.java / warcaby-serwer / src / main / java / sr / warcaby / serwer line 74 Java问题
以下是我的代码中的片段: 在这一行中,我看到一个错误。
partia.addObserver(token, new GameObserverImpl(this)), null);
GameObserver实施的片段:
class GameObserverImpl extends _GameObserverDisp { //extends IGameObserverPOA{
private static final long serialVersionUID = 1L;
PrzeciwnikKomputerowy p;
public GameObserverImpl(PrzeciwnikKomputerowy p) {
this.p = p;
}
api.ice的片段:
interface GameObserver {
void notifyObserver( CORBAMove lastMove);
};
interface GameProxy {
void addObserver( string token, GameObserver* o) throws MyException;
bool isMyTurn( string token) throws MyException;
void doMove( string token, CORBAMove move) throws MyException;
Position getPosition( string token) throws MyException;
string showPosition( string token) throws MyException;
};
不要对CORBAMove这个名字感到困惑。我使用CORBA,但我将代码更改为ICE。
答案 0 :(得分:0)
我找到了问题的答案。 现在我的应用程序按预期工作。
我编写了从Ice.Object创建ObjectPrx的方法。 此方法使用反射来查找指定类的强制转换方法。
在这个网站上,我找到了我需要的功能:https://doc.zeroc.com/display/Ice/Object+Incarnation+in+Java#ObjectIncarnationinJava-proxies
最重要的一行是:ObjectPrx objectPrx = adapter.addWithUUID(iceObject)。
然后我使用方法xxxPrxHelper.checkedCast(objectPrx)进行转换,这是我从反射中获得的。 这是更改的代码:
partia.addObserver(token, (GameObserverPrx)
serwer.createProxyForObject(observer, GameObserverPrxHelper.class), null)
ServerImpl类中的方法:
public ObjectPrx createProxyForObject(Ice.Object iceObject, Class<?> clazz) {
ObjectPrx objectPrx = adapter.addWithUUID(iceObject);
try {
Method method = clazz.getMethod("checkedCast", ObjectPrx.class);
objectPrx = (ObjectPrx) method.invoke(null, objectPrx);//adapter.createIndirectProxy(id));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return objectPrx;
方法createProxyForObject使用在服务器构造函数中初始化的普通适配器(因为PrzeciwnikKomputerowy类仍然是服务器程序的一部分)。
Ice.Communicator communicator = Ice.Util.initialize(args);
ObjectAdapter adapter = communicator.createObjectAdapter("ChessServer");