2010-10-01 6 views
4

J'utilise RMI pour autoriser l'accès à mon application Java via MATLAB, qui s'exécute dans une autre machine JVM. MATLAB a une belle interface pour imprimer les méthodes d'un objet Java. Mais il échoue avec RMI, car l'objet qu'il obtient est un proxy.RMI + réflexion java

Je voudrais donc ajouter ma propre méthode pour extraire/imprimer la capacité d'une interface distante (RMI ne peut évidemment pas accéder directement aux méthodes non disponibles dans les interfaces distantes exportées).

Comment est-ce que je pourrais faire ceci avec la réflexion, du côté de client de la connexion de RMI, ou du côté de serveur? Je n'ai pas beaucoup d'expérience en réflexion. Cas d'utilisation ci-dessous.

modifier: ce que je veux le plus coincé sur est donné un objet arbitraire X (y compris lorsque X est un proxy RMI), comment puis-je utiliser la réflexion pour obtenir les interfaces mises en œuvre par cet objet?

classes java:

/** 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;   
} 

et session client de l'échantillon dans 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 

Répondre

1

Les objets sur votre client sont proxies: ils sont appelés talons. Pour obtenir les interfaces de ce que vous devriez coder quelque chose comme ça, où o est votre objet:

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 sont automatiquement générés: Par conséquent, vous ne devriez pas mettre en œuvre quelque chose en eux, mais vous pouvez mettre en œuvre une méthode getInformation() dans votre interfaces distantes; chaque objet serveur doit implémenter ceci et retourner une chaîne qui contient toutes les informations de l'objet serveur. Cette méthode génère la chaîne en obtenant des informations via la réflexion à partir de l'objet this.

+0

.... et votre objet "c" a "plus" d'objets de classe qui sont vos interfaces. –

+0

ah, l'approche 'getClass(). GetInterfaces()' était ce qui me manquait. D'une certaine façon, je pensais que vous deviez getInterfaces() sans obtenir l'objet de classe. –

+0

Vous n'avez pas besoin d'obtenir le serveur pour l'implémenter. Le client peut exécuter exactement le même code sur son talon et obtenir la même réponse. – EJP