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
.... et votre objet "c" a "plus" d'objets de classe qui sont vos interfaces. –
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. –
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