OVH Cloud OVH Cloud

Cast en dynamique

6 réponses
Avatar
senor_asp
Bonjour,

pour une connexion g=E9n=E9rique =E0 un EJB, je dispose du code suivant :

if (appli.equals("EJB1") =3D=3D true)
{
EJB1Home home2 =3D (EJB1Home)PortableRemoteObject.narrow(objref,
EJB1Home.class);
cs_object =3D home2.create();
}
else
{
if (appli.equals("EJB2") =3D=3D true) {
EJB2Home home2 =3D
(EJB2Home)PortableRemoteObject.narrow(objref, EJB2Home.class);
cs_object =3D home2.create();
}
}

Tout marche tr=E8s bien, n=E9anmoins j'aimerai enlever les tests IF pour
travailler de mani=E8re g=E9n=E9rique.
En sachant que je dispose d'une variable String qui s'appelle appli
contenant le nom de mon EJB, je peux optimiser le code comme suit :

if (appli.equals("EJB1") =3D=3D true)
{
EJB1Home home2 =3D (EJB1Home)PortableRemoteObject.narrow(objref,
Class.forName(appli + "Home"));
cs_object =3D home2.create();
}
else
{
if (appli.equals("EJB2") =3D=3D true) {
EJB2Home home2 =3D
(EJB2Home)PortableRemoteObject.narrow(objref, Class.forName(appli +
"Home"));
cs_object =3D home2.create();
}
}

Mais je bloque sur l'avant PortableRemoteObject, donc comment puis-je
=E9crire la s=E9quence : "EJB1Home home2 =3D (EJB1Home) ...." de mani=E8re
g=E9n=E9rique donc bon pour tout nom d'EJB positionner dans la variable
appli.

Merci d'avance

6 réponses

Avatar
senor_asp
Tu as tout bon .... merci beaucoup
Avatar
alexandre cartapanis
Bonjour,

pour une connexion générique à un EJB, je dispose du code suivant :

if (appli.equals("EJB1") == true)


le deuxième test ne sert a rien, a part a ralentir ton appli...

{
EJB1Home home2 = (EJB1Home)PortableRemoteObject.narrow(objref,
EJB1Home.class);
cs_object = home2.create();
}
else
{
if (appli.equals("EJB2") == true) {
EJB2Home home2 =
(EJB2Home)PortableRemoteObject.narrow(objref, EJB2Home.class);
cs_object = home2.create();
}
}

Tout marche très bien, néanmoins j'aimerai enlever les tests IF pou r
travailler de manière générique.
En sachant que je dispose d'une variable String qui s'appelle appli
contenant le nom de mon EJB, je peux optimiser le code comme suit :

if (appli.equals("EJB1") == true)
{
EJB1Home home2 = (EJB1Home)PortableRemoteObject.narrow(objref,
Class.forName(appli + "Home"));
cs_object = home2.create();
}
else
{
if (appli.equals("EJB2") == true) {
EJB2Home home2 =
(EJB2Home)PortableRemoteObject.narrow(objref, Class.forName(appli +
"Home"));
cs_object = home2.create();
}
}

Mais je bloque sur l'avant PortableRemoteObject, donc comment puis-je
écrire la séquence : "EJB1Home home2 = (EJB1Home) ...." de maniè re
générique donc bon pour tout nom d'EJB positionner dans la variable
appli.

Merci d'avance



Perso je ferais un super classe, EJBHome, et EJB1Home et EJB2Home
étendraient cette classe. Comme ca c'est pas compliqué,

EJBHome home = (EJBHome)PortableRemoteObject.narrow(objref,
Class.forName(appli + "Home"));
home.create();

Bon après je suis pas expert EJB, aussi bien ce n'est pas possible...

--
Alexandre CARTAPANIS - Responsable Système et Réseau
Email
Gsm. 06 72 07 51 55

Macymed SARL - 9 bvd Kraëmer 13014 Marseille France
Tél. 04 91 48 31 58 - Fax. 04 91 02 36 47
Web http://www.macymed.fr - Email

Avatar
Hervé AGNOUX
wrote:


Mais je bloque sur l'avant PortableRemoteObject, donc comment puis-je
écrire la séquence : "EJB1Home home2 = (EJB1Home) ...." de manière
générique donc bon pour tout nom d'EJB positionner dans la variable
appli.



Il semble que ta variable homexx ne vive que le temps du "if", et que tu
actives toujours la même méthode dessus "create".

Donc, je me contenterais d'affecter cet homexx à une variable Object, puis
de relever dessus la méthode "create" (methodcreate homexx.getClass().getMethod("create", null)), puis j'activerais la méthode
(methodcreate.invoke(homexx, null)).

J'ai bon ?


--
Hervé AGNOUX
http://www.diaam-informatique.com

Avatar
fabrice-pas-despame.bacchella
On Mon, 10 Apr 2006 17:49:46 +0200, in fr.comp.lang.java you wrote:

Perso je ferais un super classe, EJBHome, et EJB1Home et EJB2Home
étendraient cette classe. Comme ca c'est pas compliqué,

EJBHome home = (EJBHome)PortableRemoteObject.narrow(objref,
Class.forName(appli + "Home"));
home.create();



Et pour éviter de réecrire le code, une simple interface me semble
encore plus légère, beaucoup plus que la méthode inutilement tordu
(amha) à base d'introspection évoquée ailleurs avec les risques que
cela implique d'utiiser des Object qui rendent aveugle tout le monde
(le compilo, le développeur, le mainteneur).

Bon après je suis pas expert EJB, aussi bien ce n'est pas possible...


Avatar
Olivier Thomann
if (appli.equals("EJB1") == true)
appli.equals("EJB1") == true est identique a appli.equals("EJB1").

De plus il est recommande d'inverser la condition:
"EJB1".equals(appli).
L'avantage? Pas besoin de tester qu'appli est non null.
--
Olivier

Avatar
fabrice-pas-despame.bacchella
On Tue, 11 Apr 2006 00:48:36 +0200,
wrote:

Et pour éviter de réecrire le code, une simple interface me semble
encore plus légère, beaucoup plus que la méthode inutilement tordu
(amha) à base d'introspection évoquée ailleurs avec les risques que
cela implique d'utiiser des Object qui rendent aveugle tout le monde
(le compilo, le développeur, le mainteneur).


Ppour trouver la classe à utiliser, plus de test mais une Map de
"EJB1" vers EJB1Home.class & "EJB2" vers EJB2Home.class.

Au total, on obtient un code expressif & facile a maintenir ou à
étendre.