2009-01-14 8 views
0

Disons que vous avez une définition d'interface.Implémentation de l'interface via différentes machines virtuelles Java

Cette interface peut être Opération.

Ensuite, vous avez deux applications s'exécutant dans différentes machines virtuelles Java et communiquant en quelque sorte à distance en échangeant Opération instances.

permet de les appeler l'application A et l'application B.

Si l'application A met en œuvre Opération avec la classe qui ne sont pas disponibles dans le classpath de l'application B, sera l'application B encore être en mesure de gérer cette mise en œuvre de l'interface? Même lorsque B est dans une machine JVM différente?

+0

Est-ce une question RMI? –

+0

Oui. L'idée est que ces instances d'opération soient échangées en tant que paramètres de méthode dans les EJB. – jan

Répondre

1

Cela dépend de ce que vous entendez par "communiquer en quelque sorte à distance". Si l'application A effectivement remet à l'application B une sorte de jeton qui est intégré dans un proxy de sorte que les appels à l'interface d'opération soient renvoyés à l'application A, alors cela peut être correct. Si l'idée est que l'application B crée une instance locale de la classe d'implémentation, cela ne fonctionnera pas car elle ne saura pas à quoi ressemble l'objet.

+0

L'application B doit appeler la méthode sur l'instance de l'opération. Il ne nécessite pas d'instancier la classe inconnue car elle recevra l'instance de cette classe - implémentation de l'interface connue. – jan

+0

Comment peut-il "recevoir" une instance de cette classe sans l'instancier? * Quelque chose * doit créer une instance dans la JVM, n'est-ce pas? –

+0

L'application A crée une instance d'opération, envoie cette instance à l'application B et l'application B appelle la méthode sur cette instance. – jan

0

Tant qu'il essaye seulement de le référencer par l'interface commune, il devrait être capable de le gérer. L'implémentation réelle n'a pas d'importance tant qu'ils implémentent tous les deux la même version de l'interface.

+0

Cela signifie-t-il réellement que le code d'octets java est envoyé sur le fil? – jan

+0

@jansokol: Non, ce n'est pas le cas. Par défaut, la sérialisation inclut juste un objet 'état' - la valeur de ses champs - et le type de classe. Je ne suis pas sûr que cette réponse est correcte, mais je serais heureusement mal prouvé par un lien vers quelque chose ... –

5

Cela dépend de la magie qui se passe dans votre partie "en quelque sorte communiquer à distance".

Si cette communication est effectuée via RMI ou une technologie similaire, alors ce sera très bien. L'application B crée un proxy distant pour l'objet Operation dans la machine virtuelle Java A et les méthodes appelantes de ce proxy génèrent des requêtes HTTP vers la machine JVM A, qui sont résolues par rapport à l'objet réel vivant dans cette machine virtuelle Java (ayant accès à la classe d'implémentation).

Si cette communication est effectuée en sérialisant des objets et en les envoyant sur le réseau, cela ne fonctionnera pas. Lorsque l'objet de l'application A arrive dans JVM B, la désérialisation échoue (avec un ClassNotFoundException ou similaire).

Il pourrait bien y avoir d'autres technologies d'accès distant, auquel cas les choses dépendent de l'implémentation. Je sais que les chargeurs de classes peuvent charger des classes à partir de tableaux d'octets, et donc il est conceptuellement très possible d'avoir de tels chargeurs de classe qui seraient capables de charger des classes à partir de sources distantes. De cette façon, la bibliothèque de mise en réseau pourrait en théorie sérialiser la classe réelle sur le réseau, de sorte que même si la JVM B ne connaît pas nativement la classe d'implémentation, son chargeur de classe serait fourni avec le bytecode de la classe.

Questions connexes