reflexion à l'envers...

reflexion à l'envers... - Java - Programmation

Marsh Posté le 04-01-2008 à 16:32:43    

Bonjour,
Quelqu'un saurait'il comment je peux savoir dynamiquement combien, et quels sont les noms des class qui instancie une interface ou qui étend une classe ?
 
Le but : J'ai une classe C qui à un nombre d'enfant que je connais pas (car on pourra en rajouter par la suite), et je veux en instancier un des enfants au hasard lors de l'exécution de mon programme. Je voudrais pouvoir ne pas avoir à modifier mon "proxy" qui gère cette instanciation quand on ajoutera un nouvel enfant à la classe C.
 
La réflexion d'ordinaire, c'est plutôt le contraire : j'ai un objet, je veux savoir quel sont ses parents... moi je veux les enfants...
 
Je vous remercie de votre aide !

Reply

Marsh Posté le 04-01-2008 à 16:32:43   

Reply

Marsh Posté le 05-01-2008 à 16:11:28    

Quel succès ! personne à une petite idée ?

Reply

Marsh Posté le 06-01-2008 à 16:20:42    

Naïvement je dirais que tu peux t'en sortir en parcourant l'ensemble des classes possibles et en testant si elles implémentent une interface ou étendent la classe en question.

Reply

Marsh Posté le 06-01-2008 à 18:08:47    

Eclipse permets de faire ca avec son hierarchy view, doit y'avoir moyen de voir de quelle manière ils ont implementé ca.  
 
edit : http://www.javaworld.com/javaworld [...] ip113.html  
ca peut aider peut etre


Message édité par sebi le 06-01-2008 à 18:18:41

---------------
A religious war is like children fighting over who has the strongest imaginary friend.
Reply

Marsh Posté le 10-01-2008 à 14:21:02    

Merci

Reply

Marsh Posté le 01-02-2008 à 17:16:22    

JVMDI pour scruter le contenu de la VM. Sinon créer un classloader qui va pister les utilisations d'une classe donnée (attention à transmettre les infos de sécurité dans ce cas, le classloader agira comme un proxy mais isolera les références).
 
On peut bidouiller ça en instantiant soi-même la VM avec un classpath modifié (ce que fait Eclipse pour savoir "ce qui se passe" dans le moteur, au moment où on clique sur Run ou Debug; pour la "Hierarchy View", il utilise son propre compilateur et construit un arbre de métadonnées à partir des infos qu'il a obtenues, à condition de le laisser gérer lui-même le projet ANT, mais ce sera difficile et peu pratique de réécrire ça opur l'intégrer dans une appli).
 
Donc la solution du Classloader à soi me parait la plus simple.

Reply

Marsh Posté le 03-02-2008 à 19:32:11    

Le problème, c'est que c'est totalement contraire à un élément de base de  l'objet : on ne connaît pas la liste des sous-classes d'une classe parce qu'on souhaite s'abstraire des différences entre elles, et parce que d'autres peuvent apparaître dans le futur.
 
Donc à mon avis, le plus simple, si on souhaite connaître simplement les sous-classes d'une classe, il faut que chacune d'entre elle s'abonne auprès de la classe mère lorsqu'elle est chargée ou lorsqu'une instance est créée (avec un pattern Listener comme on le trouve pour la gestion d'événéments dans Swing).

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed