OVH Cloud OVH Cloud

Référence de classes

4 réponses
Avatar
MiXAO
Dans mon programme, j'ai une classe abstract "Origin" dont héritent N
classes et j'aimerais "inscrire" ces classes quelque part.
Or, étant novice en java, je ne sais pas s'il existe un mécanisme pour
enregistrer une fois pour toute chacune de mes classes dans une sorte de
liste de meta-classe, ce qui me permettrait de référencer plus tard ces
classes où je le désire. (par exemple rempli un JComboBox avec le nom de
toutes ces classes).
Le but à plus ou moins long terme étant de pouvoir charger des classes
qui héritent de Origin à la volée et de les inscrire.
Peut-être existe-t'il un moyen de parcourir toutes les classes qui
héritent de "Origin" mais je l'ignore.
Peut-être également que je m'y prend mal, mais j'aimerais prendre la
bonne décision tout de suite, plutôt que quand mon développement sera
avancé.

4 réponses

Avatar
Hervé AGNOUX
MiXAO wrote:

Dans mon programme, j'ai une classe abstract "Origin" dont héritent N
classes et j'aimerais "inscrire" ces classes quelque part.
Or, étant novice en java, je ne sais pas s'il existe un mécanisme pour
enregistrer une fois pour toute chacune de mes classes dans une sorte de
liste de meta-classe, ce qui me permettrait de référencer plus tard ces
classes où je le désire. (par exemple rempli un JComboBox avec le nom de
toutes ces classes).


A ma connaissance il n'existe pas de mécanisme automatique de cette sorte.
Par contre, tu peux en faire un, ou t'inspirer de mécanismes que d'autres
ont fait.

Le but à plus ou moins long terme étant de pouvoir charger des classes
qui héritent de Origin à la volée et de les inscrire.
Peut-être existe-t'il un moyen de parcourir toutes les classes qui
héritent de "Origin" mais je l'ignore.
Peut-être également que je m'y prend mal, mais j'aimerais prendre la
bonne décision tout de suite, plutôt que quand mon développement sera
avancé.


La première chose à te demander est "est-ce vraiment utile ? " En effet, la
plupart du temps, ce genre de manipulation ne sert à rien.
Fondamentalement, un programme qui manipulerait des objets qui héritent de
Origin n'a pas à savoir de quelle classe ils sont exactement. Seul lui
importe de savoir que ce sont des "Origin".

Cela peut tout de même servir dans des contextes de plug-in (un serveur de
base de données qui veut être indépandant du JDBC utilisé, par ex), de
serveur (tomcat et ses webapps), et ainsi de suite.

Tu peux utiliser deux mouvements : soit tes modules Origine s'enregistrent
dans un référencement central, soit ce référencement central utilise des
règles pour découvrir les modules. Avec JDBC, par exemple, un module
s'enregistre auprès d'un Manager, c'est le premier cas. Avec Tomcat, les
applications doivent être rangées dans le repertoire "webapps", c'est le
second cas. Et les deux approches sont combinables.

Voilà les principes très généraux ; cela te permet déjà de t'orienter. Il
existe d'autres exemples dont tu pourrais t'inspirer (Eclipse, Netbeans,
JEdit, tous les navigateurs web ont un système de plug-in, etc).

Cordialement.


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

Avatar
MiXAO
Hervé AGNOUX wrote:

Tu peux utiliser deux mouvements : soit tes modules Origine s'enregistrent
dans un référencement central, soit ce référencement central utilise des
règles pour découvrir les modules. Avec JDBC, par exemple, un module
s'enregistre auprès d'un Manager, c'est le premier cas. Avec Tomcat, les
applications doivent être rangées dans le repertoire "webapps", c'est le
second cas. Et les deux approches sont combinables.



Voilà, c'est exactement ce que je veux faire. Aller enregistrer des
classes qui extend Origin dans une liste statique pour pouvoir y avoir
accés à plusieurs endroits de mon code.
Mais j'ai du mal techniquement à trouver une solution satisfaisante.

Merci pour ta réponse.

Avatar
Hervé AGNOUX
MiXAO wrote:


Voilà, c'est exactement ce que je veux faire. Aller enregistrer des
classes qui extend Origin dans une liste statique pour pouvoir y avoir
accés à plusieurs endroits de mon code.


La liste peut prendre 150.000 formes, mais en général on emploie simplement
des chaînes de caractères qui donnent le nom de ta classe. Tu créeras un
objet de cette classe avec
Class.ForName(laChaine).newInstance(), ou avec des méthodes plus élaborées
d'instrospection.

Sur cette base simple, tu rencontreras plusieurs problèmes, selon le niveau
de service que tu veux rendre.

D'abord, où mettre cette liste. Fichiers textes, fichiers XML,
base de données, etc ? Tout est possible. Si tu ne sais pas très bien où tu
vas je te suggère au départ le plus simple : un fichier texte avec chaque
ligne comportant le nom d'une classe Origin.

Ensuite il y a l'accés à cette classe, puisqu'il faut qu'elle soit
accessible d'un ClassLoader. Au départ là encore je te conseille le plus
simple : de considérer par hypothèse qu'elles sont toutes dans le
classpath ; comme cela tu n'as pas de problème de ce style.

Ensuite il faut déterminer le mode de construction d'un objet. Dire qu'ils
héritent de la classe Origin ne contraint pas le mode de construction.
L'usage de Class.forName("une.origine.Speciale").newInstance() oblige à ce
que la classe une.origine.Speciale ait un constructeur public sans
paramètre ; ce n'est peut être pas l'idéal pour toi. Néanmoins, là encore,
au départ, je te conseille de t'en contenter.

Cordialement.


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

Avatar
MiXAO
Hervé AGNOUX wrote:
MiXAO wrote:


Voilà, c'est exactement ce que je veux faire. Aller enregistrer des
classes qui extend Origin dans une liste statique pour pouvoir y avoir
accés à plusieurs endroits de mon code.



La liste peut prendre 150.000 formes, mais en général on emploie simplement
des chaînes de caractères qui donnent le nom de ta classe. Tu créeras un
objet de cette classe avec
Class.ForName(laChaine).newInstance(), ou avec des méthodes plus élaborées
d'instrospection.

Sur cette base simple, tu rencontreras plusieurs problèmes, selon le niveau
de service que tu veux rendre.

D'abord, où mettre cette liste. Fichiers textes, fichiers XML,
base de données, etc ? Tout est possible. Si tu ne sais pas très bien où tu
vas je te suggère au départ le plus simple : un fichier texte avec chaque
ligne comportant le nom d'une classe Origin.

Ensuite il y a l'accés à cette classe, puisqu'il faut qu'elle soit
accessible d'un ClassLoader. Au départ là encore je te conseille le plus
simple : de considérer par hypothèse qu'elles sont toutes dans le
classpath ; comme cela tu n'as pas de problème de ce style.

Ensuite il faut déterminer le mode de construction d'un objet. Dire qu'ils
héritent de la classe Origin ne contraint pas le mode de construction.
L'usage de Class.forName("une.origine.Speciale").newInstance() oblige à ce
que la classe une.origine.Speciale ait un constructeur public sans
paramètre ; ce n'est peut être pas l'idéal pour toi. Néanmoins, là encore,
au départ, je te conseille de t'en contenter.


C'est génial ! Merci de ton aide, c'est exactement ce que je
recherchais; commencer simple.