Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

RMI + java reflection

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
like image 617
Jason S Avatar asked Nov 14 '22 07:11

Jason S


1 Answers

The objects on your client are proxies: they are called stubs. To get the interfaces from it you should code something like this, where o is your object:

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; every server object should implement this and return a string which contains all information of the server object. This method generates the string by getting information via reflection from the this object.

like image 193
Erhard Dinhobl Avatar answered Nov 17 '22 06:11

Erhard Dinhobl