ICE - 如何将实现强制转换为代理?

时间:2015-05-07 16:17:19

标签: java distributed-system ice

我在代码中使用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。

1 个答案:

答案 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");