在参数中传递时,如何识别对象是接口的实例? [Corba,Java]

时间:2013-12-19 15:55:21

标签: java corba idl distributed-transactions jacorb

我的IDL看起来像:

interface TransactionResource {
    void prepare() raises (NotPreparedException);
    void commit() raises(TransactionException);
    void rollback() raises(TransactionException);
};
interface ManageDemand : TransactionResource {
    string createDemand(in string demand);
};

interface ManageAccount : TransactionResource {
    string createDemand(in string demand);
};

我在Server上创建ManageDemand分布式对象,我使其持久化,并且可以通过CORBALOC地址访问。

在我的客户上,我有:

Object obj = orb.string_to_object(url.toString());
TransactionResource transactionResource = null;
if (obj._is_a("IDL:transaction/ManageDemand:1.0")){
    transactionResource = ManageDemandHelper.narrow(obj);
} else {
    transactionResource = ManageAccountHelper.narrow(obj);
}

当我尝试测试transactionResource对象(分布式引用)是否是ManageDemand的实例时,结果为true。

但是如果我调用Transaction对象,定义如下:

interface Transaction {
    ProxyStream addResource(in TransactionResource resource);
}

我传入参数transactionResource分布式引用,在此方法中,当我测试此资源是否为ManageDemand的实例时,结果为false。

我要做的是,要认识到这个transactionResource是addResource方法的ManageDemand实例?

1 个答案:

答案 0 :(得分:0)

我不知道如何测试transactionResource对象(TransactionResource资源)是否是一个ManageDemand的实例,在" addResource' Transaction Servant实现的方法。
我想也许,你测试它就像下面这样:

if(resource instanceof ManageDemand ) {
  System.out.println("Yes, ManageDemand");
} else {
  System.out.println("No, ManageDemand");
}

如果是,那么你不会'得到正确答案,因为资源'从客户端获得的对象是" _TransactionResourceStub"因此,你不能使用' instanceof'测试方法。
但是,您仍然可以使用' _is_a'测试它的方法,如下所示:

if (resource._is_a("IDL:transaction/ManageAccount:1.0")){
    System.out.println("Yes");
} else {
    System.out.println("No");
}

然后,您将得到正确答案。