views:

40

answers:

1

I'm using RMI to allow access to my Java application via MATLAB, which runs in another JVM. MATLAB has a nice interface to print the methods of a Java object. But it fails with RMI, because the object it gets is a proxy.

So I would like to add my own method to extract/print the capability of a remote interface (RMI obviously can't directly access methods not available in exported remote interfaces).

How could I do this with reflection, either on the client end of the RMI connection, or on the server end? I don't have much experience using reflection. Use case below.

edit: what I'm getting most stuck on is given an arbitrary object X (including where X is an RMI proxy), how can I use reflection to obtain the interfaces implemented by that object?

java classes:

/** client-side remote describer */
class RemoteDescriber
{
    RemoteDescription describe(Remote remote) { ... }
}

/* representation of remote interfaces implemented by an object */
class RemoteDescription implements Serializable
{
    /* string representation of remote interfaces implemented by an object */
    @Override public String toString() { ... }

    /* maybe there are other methods permitting object-model-style navigation
     * of a remote interface
     */
}

interface FooRemote extends Remote
{
    /* some sample methods */
    public int getValue() throws RemoteException;
    public void setValue(int x) throws RemoteException;
    public void doSomethingSpecial() throws RemoteException;
    /* other methods omitted */        

    /** server-side */
    public RemoteDescription describe() throws RemoteException;        
}

and sample client session in MATLAB

x = ...;     % get something that implements FooRemote
describer = com.example.RemoteDescriber;
% describer is a client-side Java object

description1 = describer.describe(x)

%%% prints a description of the FooRemote interface 
%%% obtained by the client-side RemoteDescriber

description2 = x.describe()

%%% prints a description of the FooRemote interface 
%%% obtained on the server-side by x itself, and marshalled
%%% to the client
+1  A: 

the objects on your client, you are right, are proxys, they are called stubs. to get the interfaces from it you should code something like this:

where o is your object. the interfaces belong to the "Class"-class

Class c = o.getClass();

Class[] theInterfaces = c.getInterfaces();

for (int i = 0; i < theInterfaces.length; i++) {

String interfaceName = theInterfaces[i].getName();

System.out.println(interfaceName);

}

stubs are auto generated therefore you should not implement something into them. but you could implement a method "getInformation" in your remote interfaces and every server object shoudl implement this and return a string which contains all information of the "server" object. and this method generates the string by getting information via reflection from the "this" object.

Mr Q.C.
....and your object "c" has "more" Class objects which are your interfaces.
Mr Q.C.
ah, the `getClass().getInterfaces()` approach was what I was missing. Somehow I thought you had to getInterfaces() w/o getting the class object.
Jason S