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

Java Discussion :

Comment lister toutes les classes annotées ?


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 802
    Par défaut Comment lister toutes les classes annotées ?
    Bonjour,

    J'ai une annotation @SessionBean qui possède un paramètre name, et je voudrais placer en session des instances de toutes les classes annotées.

    Je voudrais savoir comment, à partir de l'attribut name, je peux retrouver la classe annotée. Il me semble que pour cela, j'aurais besoin de lister toutes les classes chargées à partir du classpath, puis retenir celles qui sont annotées.

    Savez-vous comment je peux lister les classes chargées par le classloader ?
    Ou avez-vous une autre solution ?

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par verbose Voir le message
    Savez-vous comment je peux lister les classes chargées par le classloader ?
    En créant, et utilisant, ton propre ClassLoader, qui te permette de faire cela.

    En principe, on est pas censé faire de recherche sur les classes "qui héritent de" ou "qui ont telles méthodes" ou "qui ont telles annotations" et encore moins "toutes les classes."
    C'est le contraire : quand on a une classe, on peut regarder quelles sont ses méthodes, ses annotations, ce qu'elle étend et implémente...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre Expert

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Par défaut
    Attention à ce que tu veux mettre dans la session

    Sinon nous on passe par une processeur d'annotation au build time afin d’indexer certaines classes mais le projet est une peu spécifique, peut être que ça te donneras des voies de réflexion

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 802
    Par défaut
    Citation Envoyé par Alain Defrance Voir le message
    Attention à ce que tu veux mettre dans la session

    Sinon nous on passe par une processeur d'annotation au build time afin d’indexer certaines classes mais le projet est une peu spécifique, peut être que ça te donneras des voies de réflexion
    C'est une solution un peu lourde à mon goût.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 802
    Par défaut
    Citation Envoyé par thelvin Voir le message
    En créant, et utilisant, ton propre ClassLoader, qui te permette de faire cela.

    En principe, on est pas censé faire de recherche sur les classes "qui héritent de" ou "qui ont telles méthodes" ou "qui ont telles annotations" et encore moins "toutes les classes."
    C'est le contraire : quand on a une classe, on peut regarder quelles sont ses méthodes, ses annotations, ce qu'elle étend et implémente...
    Je veux bien écrire mon propre ClassLoader, mais je n'ai pas l'impression que cela me permettra de contourner mon problème : comment lister toutes mes classes annotées ?

    J'ai bien repéré findClass(). Je peux redéfinir cette méthode et vérifier si la classe trouvée est annotée. Mais cette méthode n'est appelée que lorsqu'on sait le nom de la classe que l'on veut instancier, ce qui n'est pas le cas pour moi.

    Donc je retombe sur mon problème de départ, comment trouver une classe annotée à partir de son paramètre name ?

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par verbose Voir le message
    Je veux bien écrire mon propre ClassLoader, mais je n'ai pas l'impression que cela me permettra de contourner mon problème : comment lister toutes mes classes annotées ?

    J'ai bien repéré findClass(). Je peux redéfinir cette méthode et vérifier si la classe trouvée est annotée. Mais cette méthode n'est appelée que lorsqu'on sait le nom de la classe que l'on veut instancier, ce qui n'est pas le cas pour moi.

    Donc je retombe sur mon problème de départ, comment trouver une classe annotée à partir de son paramètre name ?
    Il faut, bien entendu, que le nouveau ClassLoader fournisse de nouvelles méthodes, telles que List<Class<?>> getAnnotedClasses(String name)

    En gros, à chaque fois qu'il charge une classe, il vérifie si elle a cette annotation, et l'ajoute à sa liste de classes ayant le name en question.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 802
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Il faut, bien entendu, que le nouveau ClassLoader fournisse de nouvelles méthodes, telles que List<Class<?>> getAnnotedClasses(String name)

    En gros, à chaque fois qu'il charge une classe, il vérifie si elle a cette annotation, et l'ajoute à sa liste de classes ayant le name en question.
    Il me semble que le ClassLoader ne charge les classes qu'à la demande. Donc si le ClassLoader n'est pas appelé avec le nom de la classe, il ne la charge pas. A moins que je me trompe.

  8. #8
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    il ne faut au contraire surtout pas passer par un classloader. En effet, charger toutes les classes dans un classloader peut avoir tout un tas d'effet de bord, dont l'un des plus important est qu'on arrivera à court de mémoire (en pratique, en général, on n'utilise qu'un faible pourcentage des classes présentes dans une librairies qu'on importe!). Le plus "sain", c'est de récupérer l'ensemble des données du classpath. Une voie d'exploration, c'est d'utiliser getClass().getProtectionDomain().getCodesSources().getLocation(). Mais ce n'est probablement suffisant. Une fois qu'on a la liste des .class, les ouvrir avec un parseur quelconque pour y lire les annotations sans les charger dans le classloader.

    Pour info, des librairies comme Spring font déjà ce genre de choses (scanner toutes les annotation JSF etc au démarrage), ce qui peut être une voie à explorer

Discussions similaires

  1. Comment lister toutes les tables d'une BD ?
    Par jmulans dans le forum Bases de données
    Réponses: 3
    Dernier message: 04/11/2007, 19h29
  2. Réponses: 2
    Dernier message: 14/08/2006, 19h23
  3. [D7][Infos système] Comment lister toutes les classes WMI ?
    Par phplive dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 03/05/2006, 23h51
  4. Réponses: 2
    Dernier message: 17/06/2005, 23h03

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