IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API standards et tierces Java Discussion :

[Reflection] Obtenir les sous-classes d'une classe


Sujet :

API standards et tierces Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 143
    Points : 68
    Points
    68
    Par défaut [Reflection] Obtenir les sous-classes d'une classe
    Bonjour

    Pour obtenir la superclasse d'une classe, on peut faire :

    Par contre, je ne sais comment faire pour obtenir les sous-classes d'une classe.
    Pourriez vous m'aider ?

    Merci

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par El Saigneur
    Par contre, je ne sais comment faire pour obtenir les sous-classes d'une classe.
    Ce n'est pas possible ! Tu dois charger toutes les classes pour vérifier si c'est une classe fille ou non...

    Pourquoi as-tu besoin de cela ?

    a++

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 143
    Points : 68
    Points
    68
    Par défaut
    Il me semblait bien que ce n'était pas possible. Je suis parti pour boucler sur les classes chargées par le ClassLoader et vérifier une par une si elles étendent ma classe. C'est lourd mais je fais ça dans un Singleton Spring et je cacherai le résultat. Dommage que l'API ne propose pas cela. N'y aurait-il pas un outils "ReflectionUtils" qui permettrait de la faire ? Le "ReflectionUtils" de Spring ne le permet pas en tout cas. Peut être dans les bibliothèques Jakarta ? Mais j'ai pas trouvé.

    J'ai besoin de faire cela pour du eager loading avec Hibernate. En fait, comme il est normal de la faire, j'ai mappé toutes mes relations en "lazy" afin de ne pas les charger inutilement. Selon les UseCases et les données des objets du domaine dont mes collègues ont besoin dans les couches supérieures de l'appli, je crée des DAO avec des "fetch join" pour minimiser le lazy-loading.
    Cependant, pour certains UseCases, les couches du dessus ont besoin de charger tout le graphe de relations à partir d'un objet en haut de l'arbre (Comme si j'avais mappé toutes les relations en lazy="false"). Plutôt que d'écrire une Criteria avec près d'une cinquantaine de relations "fetch join" en dur dans le code, je suis parti pour faire de la réflexion sur l'objet en haut de l'arbre. Mon but est de parcourir ses fields et ceux de ses classes filles (là est mon problème) afin de repérer les relations vers d'autres objet du domaine mappés. J'ai défini une interface commune à tous les objets du domaine et utilise des HashSet génériques pour mes collections. Je peux donc en parcourant les fields savoir si la collection rencontrée est une relation vers d'autres objets du domaine et ainsi ajouter un "fetch join" sur cette relation avec l'API Criteria d'Hibernate. Je tire aussi parti des requêtes polymorphiques de Hibernate me permettant de faire un join sur des relations concernant des sous-classes de la classe définie pour la criteria. De plus, cette façon de faire rend la requête auto-maintenue. En effet, si une relation s'ajoute ou est supprimée dans le graphe, aucune modification n'est à effectuer dans ma méthode.

    Bon bref. Il me faut parcourir le graphe d'héritage en descendant...

    Donc si vous voyez un moyen moins lourd et plus élégant que de scruter le ClassLoader, je suis preneur.

    D'avance Merci

  4. #4
    Membre émérite
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Points : 2 582
    Points
    2 582
    Par défaut
    Je flaire ici un anti-pattern.

    (j'ai mis la définition du wikipedia anglais, parce que celle du dico de developpez.com ne me plait pas beaucoup).

    Bon courage ! On a tous connu ça !
    Mieux que Google, utilisez Sur Java spécialisé sur la plate-forme java !
    Pour réaliser vos applications Java dans le cadre de prestations, forfait, conseil, contactez-moi en message privé.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    548
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 548
    Points : 635
    Points
    635
    Par défaut
    SessionFactory.get(All)ClassMetaData() ?

    de tout façon parcourir toutes les classes du ClassLoader c'est vraiment un mauvaise idée. Surtout dans un serveur d'application où les class loaders sont propriétaires.

    En plus si tu n'as pas de bol certaines classes n'auront pas encore été chargées et donc absentes du class loader

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 143
    Points : 68
    Points
    68
    Par défaut
    En fait, j'étais déjà parti sur la solution de the-gtm. Effectivement les objets de domaine pouvant faire l'objet d'une jointure sont forcément des objets dont la mapping Hibernate est chargé dans la SessionFactory.

    La méthode getAllClassMetaData() permet de récupérer toutes les ClassMetaData correspondant aux objets de domaine mappés dans la SessionFactory. Les ClassMetaData donnent tout un tas d'info et, pour ce qui m'intéresse, le nom de la classe mappée.

    Merci pour vos réponses. Par contre je ne vois pas en quoi parcourir un arbre d'héritage de haut en bas est plus mauvais que de la parcourir de bas en haut. Il doit bien y avoir des cas où c'est nécessaire de procéder de la sorte.
    Eclairez ma lanterne sinon...

    A +

  7. #7
    Membre émérite
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Points : 2 582
    Points
    2 582
    Par défaut
    C'est parce que, s'il existe une solution fiable pour aller de l'enfant vers le père, il n'en existe pas pour aller du père vers l'enfant.

    N'est-ce pas mieux ainsi ?...

    (pour les reproductions sexuées, il faudrait plutôt parler de la mère, d'ailleurs, parce que le père....)

    Pour une réponse plus informatique, je pense que la relation extends n'est pas symétrique, car il n'y a rien qui fixe le nombre de fils. Il est parfaitement possible de lancer un même programme avec différents classpath, et même de créer des classes pendant l'exécution d'un programme.

    L'implémentation actuelle du XSLT dans JAXP, par exemple, crée de nouvelles classes à chaque transformation, pendant l'exécution.
    Mieux que Google, utilisez Sur Java spécialisé sur la plate-forme java !
    Pour réaliser vos applications Java dans le cadre de prestations, forfait, conseil, contactez-moi en message privé.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VBA] [CLASS] accès à une classe d'une autre base
    Par gsilber dans le forum Contribuez
    Réponses: 5
    Dernier message: 29/02/2016, 12h38
  2. Créer une classe dans une classe
    Par FabaCoeur dans le forum C++
    Réponses: 9
    Dernier message: 02/06/2007, 20h26
  3. [POO] Une Classe dans une Classe. C'est possible?
    Par FrankOVD dans le forum Langage
    Réponses: 2
    Dernier message: 18/05/2006, 22h02
  4. [POO] Utilisation d'une classe dans une classe !
    Par Okinou dans le forum Langage
    Réponses: 3
    Dernier message: 16/02/2006, 14h34
  5. Une classe dans une classe...
    Par Baquardie dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 30/09/2005, 19h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo