code: static public RemoteObject getRemoteObject (Connection connection, int objectID, Class... ifaces) {
  		if (connection == null) throw new IllegalArgumentException("connection cannot be null.");
  		if (ifaces == null) throw new IllegalArgumentException("ifaces cannot be null.");
  		Class[] temp = new Class[ifaces.length + 1];
  		temp[0] = RemoteObject.class;
  		System.arraycopy(ifaces, 0, temp, 1, ifaces.length);
  		return (RemoteObject)Proxy.newProxyInstance(ObjectSpace.class.getClassLoader(), temp,
  			new RemoteInvocationHandler(connection, objectID));
  	}
docs: Returns a proxy object that implements the specified interfaces. Methods invoked on the proxy object will be invoked
  remotely on the object with the specified ID in the ObjectSpace for the specified connection. If the remote end of the
  connection has not {@link #addConnection(Connection) added} the connection to the ObjectSpace, the remote method invocations
  will be ignored.
  <p>
  Methods that return a value will throw {@link TimeoutException} if the response is not received with the
  {@link RemoteObject#setResponseTimeout(int) response timeout}.
  <p>
  If {@link RemoteObject#setNonBlocking(boolean) non-blocking} is false (the default), then methods that return a value must
  not be called from the update thread for the connection. An exception will be thrown if this occurs. Methods with a void
  return value can be called on the update thread.
  <p>
  If a proxy returned from this method is part of an object graph sent over the network, the object graph on the receiving
  side will have the proxy object replaced with the registered object.
  @see RemoteObject