Skip to main content
Skip table of contents

Client-Side Java Mapping for Interfaces

Proxy Interfaces

On the client side, a Slice interface maps to a Java interface with methods that correspond to the operations on that interface. Consider the following Slice interface:

SLICE
interface Simple
{
    void op();
}

The Slice compiler generates the following definition for use by the client:

JAVA
public interface SimplePrx extends com.zeroc.Ice.ObjectPrx {
    void op();
    void op(java.util.Map<String, String> context);

    java.util.concurrent.CompletableFuture<Void> opAsync();
    
    java.util.concurrent.CompletableFuture<Void> opAsync(
        java.util.Map<String, String> context);
}

As you can see, the compiler generates a proxy interface SimplePrx. In general, the generated name is <interface-name>Prx.

In the client's address space, an instance of SimplePrx is the local ambassador for a remote instance of an Ice object that implements Simple and is known as a proxy instance. All the details about the server-side object, such as its address, what protocol to use, and its object identity are encapsulated in that instance.

Creating a Proxy

The generated proxy interface provides a static createProxy method. With our previous example:

JAVA
public interface SimplePrx extends com.zeroc.Ice.ObjectPrx {
    static SimplePrx createProxy(
        com.zeroc.Ice.Communicator communicator, String proxyString)
    ...
}

Use createProxy to create a proxy from a communicator and a “stringified” proxy:

JAVA
SimplerPrx simple = SimplePrx.createProxy(
    communicator, "simple:tcp -h localhost -p 4061");

Inheritance from com.zeroc.Ice.ObjectPrx

All generated proxy interfaces inherit directly or indirectly from the com.zeroc.Ice.ObjectPrx interface, reflecting the fact that all Slice interfaces implicitly inherit from Object.

Interface Inheritance

Inheritance relationships among Slice interfaces are maintained in the generated Java interfaces. For example:

SLICE
interface A { ... }
interface B { ... }
interface C extends A, B { ... }

The generated code for CPrx reflects the inheritance hierarchy:

JAVA
public interface CPrx extends APrx, BPrx {
    ...
}

Given a proxy for C, a client can invoke any operation defined for interface C, as well as any operation inherited from C's base interfaces.

Casting a Proxy

In addition to createProxy, the generated proxy interfaces provides two static methods for converting a proxy into a proxy of another type:

JAVA
public interface SimplePrx extends com.zeroc.Ice.ObjectPrx {
    static SimplePrx uncheckedCast(com.zeroc.Ice.ObjectPrx obj)

    static SimplePrx checkedCast(com.zeroc.Ice.ObjectPrx obj)
}

uncheckedCast

The helper’s uncheckedCast static method allows you to convert any proxy into a proxy of this type. For example:

JAVA
// Convert a SimplePrx into a WidgetPrx, even though the two types are unrelated.
WidgetPrx widget = WidgetPrx.uncheckedCast(simple);

uncheckedCast is a local operation that always succeeds.

checkedCast

checkedCastis a conditional cast of the proxy: this method makes a remote call to the target object to check if this object implements the proxy’s Slice interface. For example:

JAVA
// Call operation ice_isA on the Ice object to check if it implements Slice interface
// Widget.
WidgetPrx widget = WidgetPrx.checkedCast(simple);

If the target object implements the Slice interface, checkedCastreturns a non-null proxy, just like uncheckedCast. If the target object doesn’t implement this interface, checkedCast returns null. checkedCastcan also throw an exception, for example if it cannot reach the remote object.

While checkedCast sounds safer than uncheckedCast (you’re making an additional check before casting), in practice you know or should know the type of your proxies and calling checkedCast is rarely necessary.

Proxy Factory Methods

The base proxy interface ObjectPrx supports a variety of methods for customizing a proxy. Since proxies are immutable, each of these factory methods returns a copy of the original proxy that contains the desired modification. For example, you can obtain a proxy configured with a ten second invocation timeout as shown below:

JAVA
GreeterPrx greeter = GreeterPrx.createProxy(...);

// Create a new GreeterPrx and assign it to greeter.
greeter = greeter.ice_invocationTimeout(10000);

The factory methods usually return a proxy of the same type as the current proxy, as in the example above.

The only exceptions are the factory methods ice_facet and ice_identity. Calls to either of these methods may produce a proxy for an object of an unrelated type, and you need to cast the returned proxy. For example:

JAVA
GreeterPrx greeter = GreeterPrx.createProxy(...);
GreeterAdminPrx greeterAdmin = GreeterAdminPrx.uncheckedCast(
    greeter.ice_facet("admin"));
JavaScript errors detected

Please note, these errors can depend on your browser setup.

If this problem persists, please contact our support.