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é.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
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).
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
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.
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.
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.
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
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.
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
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.
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.
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.