FileDocCategorySizeDatePackage
RemoteObject.javaAPI DocJava SE 5 API16889Fri Aug 26 14:57:12 BST 2005java.rmi.server

RemoteObject

public abstract class RemoteObject extends Object implements Remote, Serializable
The RemoteObject class implements the java.lang.Object behavior for remote objects. RemoteObject provides the remote semantics of Object by implementing methods for hashCode, equals, and toString.
author
Ann Wollrath
author
Laird Dornin
author
Peter Jones
version
1.33, 03/12/19
since
JDK1.1

Fields Summary
protected transient RemoteRef
ref
The object's remote reference.
private static final long
serialVersionUID
indicate compatibility with JDK 1.1.x version of class
Constructors Summary
protected RemoteObject()
Creates a remote object.


             
      
	ref = null;
    
protected RemoteObject(RemoteRef newref)
Creates a remote object, initialized with the specified remote reference.

param
newref remote reference

	ref = newref;
    
Methods Summary
public booleanequals(java.lang.Object obj)
Compares two remote objects for equality. Returns a boolean that indicates whether this remote object is equivalent to the specified Object. This method is used when a remote object is stored in a hashtable. If the specified Object is not itself an instance of RemoteObject, then this method delegates by returning the result of invoking the equals method of its parameter with this remote object as the argument.

param
obj the Object to compare with
return
true if these Objects are equal; false otherwise.
see
java.util.Hashtable

	if (obj instanceof RemoteObject) {
	    if (ref == null) {
		return obj == this;
	    } else {
		return ref.remoteEquals(((RemoteObject)obj).ref);
	    }
	} else if (obj != null) {
	    /*
	     * Fix for 4099660: if object is not an instance of RemoteObject,
	     * use the result of its equals method, to support symmetry is a
	     * remote object implementation class that does not extend
	     * RemoteObject wishes to support equality with its stub objects.
	     */
	    return obj.equals(this);
	} else {
	    return false;
	}
    
public java.rmi.server.RemoteRefgetRef()
Returns the remote reference for the remote object.

Note: The object returned from this method may be an instance of an implementation-specific class. The RemoteObject class ensures serialization portability of its instances' remote references through the behavior of its custom writeObject and readObject methods. An instance of RemoteRef should not be serialized outside of its RemoteObject wrapper instance or the result may be unportable.

return
remote reference for the remote object
since
1.2

	return ref;
    
public inthashCode()
Returns a hashcode for a remote object. Two remote object stubs that refer to the same remote object will have the same hash code (in order to support remote objects as keys in hash tables).

see
java.util.Hashtable

	return (ref == null) ? super.hashCode() : ref.remoteHashCode();
    
private voidreadObject(java.io.ObjectInputStream in)
readObject for custom serialization.

This method reads this object's serialized form for this class as follows:

The readUTF method is invoked on in to read the external ref type name for the RemoteRef instance to be filled in to this object's ref field. If the string returned by readUTF has length zero, the readObject method is invoked on in, and than the value returned by readObject is cast to RemoteRef and this object's ref field is set to that value. Otherwise, this object's ref field is set to a RemoteRef instance that is created of an implementation-specific class corresponding to the external ref type name returned by readUTF, and then the readExternal method is invoked on this object's ref field.

If the external ref type name is "UnicastRef", "UnicastServerRef", "UnicastRef2", "UnicastServerRef2", or "ActivatableRef", a corresponding implementation-specific class must be found, and its readExternal method must read the serial data for that external ref type name as specified to be written in the serialData documentation for this class. If the external ref type name is any other string (of non-zero length), a ClassNotFoundException will be thrown, unless the implementation provides an implementation-specific class corresponding to that external ref type name, in which case this object's ref field will be set to an instance of that implementation-specific class.

	String refClassName = in.readUTF();
	if (refClassName == null || refClassName.length() == 0) {
	    /*
	     * No reference class name specified, so construct
	     * remote reference from its serialized form.
	     */
	    ref = (RemoteRef) in.readObject();
	} else {
	    /*
	     * Built-in reference class specified, so delegate to
	     * internal reference class to initialize its fields from
	     * its external form.
	     */
	    String internalRefClassName =
		RemoteRef.packagePrefix + "." + refClassName;
	    Class refClass = Class.forName(internalRefClassName);
	    try {
		ref = (RemoteRef) refClass.newInstance();

		/*
		 * If this step fails, assume we found an internal
		 * class that is not meant to be a serializable ref
		 * type.
		 */
	    } catch (InstantiationException e) {
		throw new ClassNotFoundException(internalRefClassName, e);
	    } catch (IllegalAccessException e) {
		throw new ClassNotFoundException(internalRefClassName, e);
	    } catch (ClassCastException e) {
		throw new ClassNotFoundException(internalRefClassName, e);
	    }
	    ref.readExternal(in);
	}
    
public java.lang.StringtoString()
Returns a String that represents the value of this remote object.

	String classname = Util.getUnqualifiedName(getClass());
	return (ref == null) ? classname :
	    classname + "[" + ref.remoteToString() + "]";
    
public static java.rmi.RemotetoStub(java.rmi.Remote obj)
Returns the stub for the remote object obj passed as a parameter. This operation is only valid after the object has been exported.

param
obj the remote object whose stub is needed
return
the stub for the remote object, obj.
exception
NoSuchObjectException if the stub for the remote object could not be found.
since
1.2

	if (obj instanceof RemoteStub ||
	    (obj != null &&
	     Proxy.isProxyClass(obj.getClass()) &&
	     Proxy.getInvocationHandler(obj) instanceof
	     RemoteObjectInvocationHandler))
	{
	    return obj; 
	} else {
	    return sun.rmi.transport.ObjectTable.getStub(obj);
	}
    
private voidwriteObject(java.io.ObjectOutputStream out)
writeObject for custom serialization.

This method writes this object's serialized form for this class as follows:

The {@link RemoteRef#getRefClass(java.io.ObjectOutput) getRefClass} method is invoked on this object's ref field to obtain its external ref type name. If the value returned by getRefClass was a non-null string of length greater than zero, the writeUTF method is invoked on out with the value returned by getRefClass, and then the writeExternal method is invoked on this object's ref field passing out as the argument; otherwise, the writeUTF method is invoked on out with a zero-length string (""), and then the writeObject method is invoked on out passing this object's ref field as the argument.

serialData
The serialized data for this class comprises a string (written with ObjectOutput.writeUTF) that is either the external ref type name of the contained RemoteRef instance (the ref field) or a zero-length string, followed by either the external form of the ref field as written by its writeExternal method if the string was of non-zero length, or the serialized form of the ref field as written by passing it to the serialization stream's writeObject if the string was of zero length.

If this object is an instance of {@link RemoteStub} or {@link RemoteObjectInvocationHandler} that was returned from any of the UnicastRemoteObject.exportObject methods and custom socket factories are not used, the external ref type name is "UnicastRef". If this object is an instance of RemoteStub or RemoteObjectInvocationHandler that was returned from any of the UnicastRemoteObject.exportObject methods and custom socket factories are used, the external ref type name is "UnicastRef2". If this object is an instance of RemoteStub or RemoteObjectInvocationHandler that was returned from any of the java.rmi.activation.Activatable.exportObject methods, the external ref type name is "ActivatableRef". If this object is an instance of RemoteStub or RemoteObjectInvocationHandler that was returned from the RemoteObject.toStub method (and the argument passed to toStub was not itself a RemoteStub), the external ref type name is a function of how the remote object passed to toStub was exported, as described above. If this object is an instance of RemoteStub or RemoteObjectInvocationHandler that was originally created via deserialization, the external ref type name is the same as that which was read when this object was deserialized.

If this object is an instance of java.rmi.server.UnicastRemoteObject that does not use custom socket factories, the external ref type name is "UnicastServerRef". If this object is an instance of UnicastRemoteObject that does use custom socket factories, the external ref type name is "UnicastServerRef2".

Following is the data that must be written by the writeExternal method and read by the readExternal method of RemoteRef implementation classes that correspond to the each of the defined external ref type names:

For "UnicastRef":

  • the hostname of the referenced remote object, written by {@link java.io.ObjectOutput#writeUTF(String)}
  • the port of the referenced remote object, written by {@link java.io.ObjectOutput#writeInt(int)}
  • the data written as a result of calling {link java.rmi.server.ObjID#write(java.io.ObjectOutput)} on the ObjID instance contained in the reference
  • the boolean value false, written by {@link java.io.ObjectOutput#writeBoolean(boolean)}

For "UnicastRef2" with a null client socket factory:

  • the byte value 0x00 (indicating null client socket factory), written by {@link java.io.ObjectOutput#writeByte(int)}
  • the hostname of the referenced remote object, written by {@link java.io.ObjectOutput#writeUTF(String)}
  • the port of the referenced remote object, written by {@link java.io.ObjectOutput#writeInt(int)}
  • the data written as a result of calling {link java.rmi.server.ObjID#write(java.io.ObjectOutput)} on the ObjID instance contained in the reference
  • the boolean value false, written by {@link java.io.ObjectOutput#writeBoolean(boolean)}

For "UnicastRef2" with a non-null client socket factory:

  • the byte value 0x01 (indicating non-null client socket factory), written by {@link java.io.ObjectOutput#writeByte(int)}
  • the hostname of the referenced remote object, written by {@link java.io.ObjectOutput#writeUTF(String)}
  • the port of the referenced remote object, written by {@link java.io.ObjectOutput#writeInt(int)}
  • a client socket factory (object of type java.rmi.server.RMIClientSocketFactory), written by passing it to an invocation of writeObject on the stream instance
  • the data written as a result of calling {link java.rmi.server.ObjID#write(java.io.ObjectOutput)} on the ObjID instance contained in the reference
  • the boolean value false, written by {@link java.io.ObjectOutput#writeBoolean(boolean)}

For "ActivatableRef" with a null nested remote reference:

  • an instance of java.rmi.activation.ActivationID, written by passing it to an invocation of writeObject on the stream instance
  • a zero-length string (""), written by {@link java.io.ObjectOutput#writeUTF(String)}

For "ActivatableRef" with a non-null nested remote reference:

  • an instance of java.rmi.activation.ActivationID, written by passing it to an invocation of writeObject on the stream instance
  • the external ref type name of the nested remote reference, which must be "UnicastRef2", written by {@link java.io.ObjectOutput#writeUTF(String)}
  • the external form of the nested remote reference, written by invoking its writeExternal method with the stream instance (see the description of the external form for "UnicastRef2" above)

For "UnicastServerRef" and "UnicastServerRef2", no data is written by the writeExternal method or read by the readExternal method.

	if (ref == null) {
	    throw new java.rmi.MarshalException("Invalid remote object");
	} else {
	    String refClassName = ref.getRefClass(out);
	    if (refClassName == null || refClassName.length() == 0) {
		/*
		 * No reference class name specified, so serialize
		 * remote reference.
		 */
		out.writeUTF("");
		out.writeObject(ref);
	    } else {
		/*
		 * Built-in reference class specified, so delegate
		 * to reference to write out its external form.
		 */
		out.writeUTF(refClassName);
		ref.writeExternal(out);
	    }
	}