Как я могу узнать, что объект является экземпляром интерфейса при передаче в параметре? [Корба, Ява]
Мой 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");
}
Тогда вы получите правильный ответ.