почему Java RMI не может получить возвращаемое значение по ссылке - PullRequest
1 голос
/ 28 февраля 2012

В RMI я могу получить возвращаемое значение только по

InetSocketAddress address = new InetSocketAddress(hostname, port);
Server server = Stub.create(Server.class, address);
int return = server.getValue();

Но я не могу получить его по

public class Return {
    int value;
}
InetSocketAddress address = new InetSocketAddress(hostname, port);
Server server = Stub.create(Server.class, address);
Return return = new Return();
server.getValue(return);

Я знаю, что аргументы будут сериализованы и десериализованы, ноэто не мой вопрос, мой вопрос: «почему Java не может эмулировать передачу по ссылке как передачу по входу-выходу, как это было сделано в C с RPC?», я думаю, что это связано со средой Java.Под in-out я имею в виду C с RPC, вы можете получить возвращаемое значение на

int return;
rpc.getValue(&return);

Надеюсь, теперь мой вопрос ясен.

Ответы [ 3 ]

4 голосов
/ 28 февраля 2012

Возврат дополнительных прокси-объектов объекта создаст проблему для реализации. В настоящее время существует только один способ создания удаленного объекта. если методам разрешено порождать больше удаленных объектов, просто возвращая обычные объекты, то все эти вызовы должны быть перехвачены, объекты должным образом каталогизированы и т. д.

Другими словами, люди на Java - в отличие от e. г. DCOM люди - решили не делать лишнюю сантехнику. И это всегда будет ответом на вопросы «почему система A отличается от системы B».

1 голос
/ 28 февраля 2012

Ссылка - это адрес памяти вашего компьютера. С RMI вы пытаетесь передать этот адрес памяти (потенциально) другой машине, где этот адрес памяти не имеет смысла в этом контексте. Другая машина не будет теперь, как интерпретировать этот адрес. Это только то, почему значения могут быть переданы.

0 голосов
/ 28 февраля 2012

Когда вы передаете аргументы методу методом «передача по ссылке», вы передаете ссылку, что невозможно при удаленных вызовах.И помните, что Java поддерживает только передачу по значениям (даже ссылки на объекты).

Вы можете сказать, что среда выполнения RMI может десериализовать все аргументы обратно клиенту, но это будет проблемой:

Предположим,у вас есть Long в качестве аргумента, поэтому среда выполнения Java будет сериализовать его на сервер, и что тогда?Должно ли это десериализовать это?помните, что Long являются неизменяемыми.

Если среда выполнения Java создает другой экземпляр Long, то как он может обновить все экземпляры, ссылающиеся на старый Long (который был передан в качестве аргумента)?

...