The client calls a method in the proxy, and the proxy takes care of contacting the server, or whatever it has to do to perform the service. It could just be an RMI stub, which marshals the data and communicated it to the server. The proxy might be something like a printer driver, so that when a new printer becomes available, clients obtain the printer driver for the new printer through the JINI Lookup process. The proxy can even do all the work within its own code without contacting any other machine, if that's what's appropriate. So the proxy is mobile code which is downloaded to the client to perform any necessary work.
Proxies really represent a paradigm shift in distributed programming.
In the past, the principle of distributed computing was to move the data to the code. With proxies, you can move arbitrary code to the clients. The attributes are values the service uses to describe itself to the ServiceRegistrar and, through the ServiceRegistrar, to potential clients. But it's also possible to have other attributes. A printer, for example, might have attributes that indicate that it's a printer, a laser printer, and a color printer.