Как я могу узнать, что объект является экземпляром интерфейса при передаче в параметре? [Корба, Ява]

Мой 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);
};

Я создаю распределенный объект 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);
}

Когда я пытаюсь проверить, является ли объект actionResource (распределенная ссылка) экземпляром ManageDemand, результат равен true.

Но если я вызову объект транзакции, определенный следующим образом:

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

И я передаю в параметре распределенную ссылку actionResource, в этом методе, когда я проверяю, является ли этот ресурс экземпляром ManageDemand, результат равен false.

Что мне нужно сделать, чтобы распознать, что эта транзакция является экземпляром ManageDemand для метода addResource?

1 ответ

Я не знаю, как вы проверяете, является ли объект actionResource (ресурс 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");
}

Тогда вы получите правильный ответ.

Другие вопросы по тегам